排序----堆排序
2017-11-30 00:00
190 查看
摘要: 堆排序的思想:将待排序数组构造成最小(大)堆,每次从堆中取出最小(大)的元素来实现排序。
上一篇:快速排序
数据结构--堆的构造和实现
堆排序可以分为两个阶段:
构造堆。将原始数组重新组织安排进一个堆中
下沉排序。从堆中按递减顺序取出所有元素并得到排序结果
用下沉操作由N个元素构造堆只需少于2N次比较以及少于N次交换。
将N个元素排序,堆排序只需少于(2NlgN+2N)次比较以及一半次数的交换。2N来字堆的构造。
堆排序的特点:
唯一的能够同时最优地利用空间和时间的方法。
无法利用缓存。数组元素很少和相邻的元素直接比较,因此缓存未命中的次数远远高于其他排序算法。
能够在插入操作和删除最大元素操作混合的动态场景中保证对数级别的运行时间。
堆排序实现要点:
代码中堆是用数组实现的,数组a[0]弃之不用,堆顶元素存在a[1]中。
最先构造的堆是最大堆(元素越大越靠近堆顶),然后通过循环交换a[1]和a[N--]元素,使大元素沉到数组底部,并修复堆。如此循环直到堆为空,则实现堆的数组中元素已经排好序了。
下面代码是堆排序主要算法,具体堆的实现可以参考数据结构----堆。
下一篇:排序算法总结
上一篇:快速排序
数据结构--堆的构造和实现
堆排序可以分为两个阶段:
构造堆。将原始数组重新组织安排进一个堆中
下沉排序。从堆中按递减顺序取出所有元素并得到排序结果
用下沉操作由N个元素构造堆只需少于2N次比较以及少于N次交换。
将N个元素排序,堆排序只需少于(2NlgN+2N)次比较以及一半次数的交换。2N来字堆的构造。
堆排序的特点:
唯一的能够同时最优地利用空间和时间的方法。
无法利用缓存。数组元素很少和相邻的元素直接比较,因此缓存未命中的次数远远高于其他排序算法。
能够在插入操作和删除最大元素操作混合的动态场景中保证对数级别的运行时间。
堆排序实现要点:
代码中堆是用数组实现的,数组a[0]弃之不用,堆顶元素存在a[1]中。
最先构造的堆是最大堆(元素越大越靠近堆顶),然后通过循环交换a[1]和a[N--]元素,使大元素沉到数组底部,并修复堆。如此循环直到堆为空,则实现堆的数组中元素已经排好序了。
下面代码是堆排序主要算法,具体堆的实现可以参考数据结构----堆。
public static void sort(Comparable[] a){ int N = a.length; for(int k=N/2;k>=1;k--)//构造堆 sink(a,k,N);//由上至下的堆有序化(下沉)的实现 while(N>1){ exch(a,1,N--);//交换 sink(a,1,N);//修复堆 } }
下一篇:排序算法总结
相关文章推荐
- 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现)
- 【数据结构练习】排序——堆排序和快排
- Java 八大排序之——堆排序
- 排序---堆排序
- 冒泡排序,快速排序,堆排序比较
- 排序 堆排序 例程
- 三 选择排序(简单选择排序和堆排序)
- Java排序:冒泡排序、快速排序、堆排序
- 排序系列- 堆排序
- c语言 快速排序---归并排序----堆排序
- 排序和顺序统计学(1)——堆排序
- 算法学习之排序学习之堆排序和如何建堆
- 选择排序(直接选择排序,堆排序)
- 6种排序算法及其比较 简单选择排序,堆排序,简单插入排序,希尔排序,冒泡排序,快速排序,归并排序
- 排序方法汇总(一)堆排序
- 【排序】堆排序
- 有意思的排序算法-堆排序
- 插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序
- 使用堆排序对一组随机数进行排序
- 排序之选择排序、堆排序、归并排序、快速排序