堆排序结合了插入排序和归并排序的有点:它空间复杂度是O(1), 时间复杂度是O(nlgn). 要讲堆排序,先讲数据结构“堆” 堆: 堆是用数组来存放一个完全二叉树的数据结构。假设数组名是A,树的根节点存放在A[1]。它的左孩子存放在A[2],右孩子存放在A[3] 即:对于某个下标位i的节点,它的左孩 ...
分类:
编程语言 时间:
2018-01-23 22:09:21
阅读次数:
219
非线性时间比较类排序 一、交换类排序:冒泡排序和快速排序 冒泡排序:从数组中第一个数开始,依次与下一个数比较并次交换比自己小的数,直到最后一个数。如果发生交换,则继续下面的步骤,如果未发生交换,则数 组有序,排序结束。 平均时间复杂度:n方 空间复杂度:1 快速排序:快速排序又称分区交换排序,是对冒 ...
分类:
编程语言 时间:
2018-01-23 14:28:57
阅读次数:
204
一、定义 ①堆通常是可被视为完全二叉树的数组。 ②堆中任意节点的数值总是大于或等于其左右子节点,为大根堆。 ③堆中任意节点的数值总是小于或等于其左右子节点,为小根堆。 二、存储 对于任意节点T[i] ①若其父节点存在,为T[(i - 1) / 2] ②若其左兄弟节点存在,为T[i - 1] ③若其右 ...
分类:
编程语言 时间:
2018-01-23 13:05:35
阅读次数:
198
第4题,杂技算法只交换一次,貌似比求逆快,但是时间还与cache与内存的块交换有关,因为杂技算计访问的数据不连续,并且每次又只访问一个元素,频繁的换进换出,所以实际时间长。 第6题,给每个名字编码,将编码一样的放在一起,并按字典序顺序排列,查找的时候二分查找就可以了。 第7题,其实就是把列作为标识, ...
分类:
其他好文 时间:
2018-01-18 00:56:45
阅读次数:
198
1. 完全二叉树:叶节点只能出现在最后层或次下层,并且最下面一层的节点都集中在该层的最左边的二叉树。 2. 二叉堆:堆是一颗二叉树,并且满足下面的条件: (1)树的每一层都是满,除了最后一层的最右边元素 (2)任意一个父节点都大于或等于(小于或等于)两个子节点。(大于或等于的为最大堆,小于或等于的为 ...
分类:
编程语言 时间:
2018-01-17 01:13:05
阅读次数:
192
上一篇总结了直接选择排序和堆排序,这一篇要总结的是插入排序中的直接插入排序和希尔排序,我们主要从以下几点进行总结。 1、直接插入排序及算法实现 2、希尔排序及算法实现 3、直接插入排序PK希尔排序 1、直接插入排序及算法实现 什么是直接插入排序呢?直接插入排序的基本思想是:每次从无序序列中取出第一个 ...
分类:
编程语言 时间:
2018-01-15 00:30:32
阅读次数:
187
// 使用堆排序实现 其时间复杂度为O(nlgn) private static void buildMaxHeap(int[] input, int end) { // 从非叶子节点开始进行 for (int i = (end - 1) / 2; i >= 0; i--) { // 当前节点 cu ...
分类:
编程语言 时间:
2018-01-14 14:30:29
阅读次数:
160
上一篇总结了交换排序的冒泡排序和快速排序。这一篇要总结的是选择排序,选择排序分为直接选择排序和堆排序,主要从以下几点进行总结。 1、直接选择排序及算法实现 2、堆排序及算法实现 1、直接选择排序及算法实现 直接选择排序(Straight Select Sort) 是一种简单的排序方法,它的基本思想是 ...
分类:
编程语言 时间:
2018-01-14 10:55:33
阅读次数:
151
思路参考《算法导论》P84 堆排序中用到的最重要的就是堆这种数据结构,也正是因为这种数据结构能把时间复杂度控制在O(n * lgn) heapsort算法主要依赖于两个函数 MAX_HEAPIFY(int *A,int i,int len) 用于维护最大堆,时间复杂度为O(lgn),注意书上描述这个 ...
分类:
编程语言 时间:
2018-01-13 18:52:57
阅读次数:
205
//heapsort #include using namespace std; const int maxn =105; int a[maxn]; int n; void HeapInsert(int a[],int index) { while(a[index] > a[(index-1)/2]... ...
分类:
编程语言 时间:
2018-01-13 14:23:44
阅读次数:
164