堆排序是一种原地排序排序算法,不使用额外的数组空间,运行时间为O(nlgn)。本篇文章我们来介绍一下堆排序的实现过程。
要了解堆排序,我们首先来了解一个概念,完全二叉树。堆是一种完全二叉树或者近似完全二叉树。什么是完全二叉树呢?百度百科上给出定义:完全二叉树:除最后一层外,每一层上的节点数均达到最大值;在最后一层上只缺少右边的若干结点。下面用两个小图来说明完全二叉树与非完全二叉树。(图片来自百度...
分类:
编程语言 时间:
2016-04-10 11:34:35
阅读次数:
294
最近过的最短路题目稍微总结一下,顺便写一下模板,最短路算法众多有floyd、dij、bell-man、spfa,速度最快就是dij+优先队列或者dij+堆排序,spfa理论上很快o(ke)但实际并不一定不过spfa传说中有一个很NB用处就是处理带负权回路。 邻接表VS邻接矩阵:根据写题经验,如果可以 ...
分类:
其他好文 时间:
2016-04-08 21:33:51
阅读次数:
277
TopK的解决方法一般有两种:堆排序和partition。前者用优先队列实现,时间复杂度为O(NlogK)(N为元素总数量),后者可以直接调用C++ STL中的nth_element函数,时间复杂度O(N)。如果想获取动态更新数据的topK就不那么容易了,比如实时更新最常访问的top10的网址,显然 ...
分类:
编程语言 时间:
2016-04-08 06:26:02
阅读次数:
262
原文 其它较好的的介绍:堆排序 AVL树 树堆,在数据结构中也称Treap(事实上在国内OI界常称为Traep,与之同理的还有"Tarjan神犇发明的"Spaly),是指有一个随机附加域满足堆的性质的二叉搜索树,其结构相当于以随机数据插入的二叉搜索树。其基本操作的期望时间复杂度为O(logn)。相对 ...
分类:
其他好文 时间:
2016-04-07 20:44:01
阅读次数:
288
voidAdjustHeap(int*a,intsize,introot)//建最大堆{ if(a==NULL) { return; } intchild=root*2+1; while(child<size) { if((child+1)<size&&a[child]<a[child+1]) { ++child; } if(a[root]<a[child]) { swap(a[child],a[root]); } root=child;..
分类:
编程语言 时间:
2016-04-07 01:39:03
阅读次数:
178
今天好好的把各种排序都总结了一下,感觉印象加深了不少! 下面列出各种排序: 1.插入排序 2.冒泡排序 3.快速排序 4.归并排序 5.选择排序 6.堆排序 7.希尔排序 ...
分类:
编程语言 时间:
2016-04-03 18:44:51
阅读次数:
146
基本思想 1)将初始待排序关键字序列(R1,R2....Rn)构建成大顶堆,此堆为初始的无序区; 2)将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,......Rn-1)和新的有序区(Rn),且满足R[1,2...n-1]<=R[n]; 3)由于交换后新的堆顶R[1] ...
分类:
编程语言 时间:
2016-04-03 17:22:21
阅读次数:
161
交换排序(冒泡排序、快速排序) 插入排序(直接插入排序、希尔排序)、 选择排序(直接选择、堆排序) 归并排序 基排序 1.冒泡排序 时间复杂度:最优情况下是O(n),最坏情况和平均情况是O(n2) 空间复杂度:O(1) 稳定 算法实现是 从小到大排序 结果是1 2 3 5 6 7 2 快速排序 时间 ...
分类:
编程语言 时间:
2016-04-02 17:31:55
阅读次数:
221
答案A 不稳定:简单选择排序,希尔排序,快速排序,堆排序,冒泡 稳定:直接插入排序,归并排序,基数排序 ...
分类:
其他好文 时间:
2016-04-02 12:01:43
阅读次数:
147