堆排序 Heap Sort
2012-11-30 21:53
218 查看
堆排序 Heap Sort
堆排序是一种选择排序,其时间复杂度为O(nlogn)。堆的定义
n个元素的序列{k1,k2,…,kn}当且仅当满足下列关系之一时,称之为堆。
情形1:ki <= k2i 且ki <= k2i+1 (最小化堆或小顶堆)
情形2:ki >= k2i 且ki >= k2i+1 (最大化堆或大顶堆)
其中i=1,2,…,n/2向下取整;
Heap Sort
//堆筛选函数 //已知H[start~end]中除了start之外均满足堆的定义 //本函数进行调整,使H[start~end]成为一个大顶堆 typedef int ElemType; void HeapAdjust(ElemType H[], int start, int end) { ElemType temp = H[start]; for(int i = 2*start + 1; i<=end; i*=2) { //因为假设根结点的序号为0而不是1,所以i结点左孩子和右孩子分别为2i+1和2i+2 if(i<end && H[i]<H[i+1])//左右孩子的比较 { ++i;//i为较大的记录的下标 } if(temp > H[i])//左右孩子中获胜者与父亲的比较 { break; } //将孩子结点上位,则以孩子结点的位置进行下一轮的筛选 H[start]= H[i]; start = i; } H[start]= temp; //插入最开始不和谐的元素 } void HeapSort(ElemType A[], int n) { //先建立大顶堆 for(int i=n/2; i>=0; --i) { HeapAdjust(A,i,n); } //进行排序 for(int i=n-1; i>0; --i) { //最后一个元素和第一元素进行交换 ElemType temp=A[i]; A[i] = A[0]; A[0] = temp; //然后将剩下的无序元素继续调整为大顶堆 HeapAdjust(A,0,i-1); } }
堆排序分析
堆排序方法对记录数较少的文件并不值得提倡,但对n较大的文件还是很有效的。因为其运行时间主要耗费在建初始堆和调整建新堆时进行的反复“筛选”上。堆排序在最坏的情况下,其时间复杂度也为O(nlogn)。相对于快速排序来说,这是堆排序的最大优点。此外,堆排序仅需一个记录大小的供交换用的辅助存储空间。
参考资料:
严蔚敏《数据结构》
/article/4718950.html
/article/1389267.html
相关文章推荐
- 八大排序算法之四选择排序—堆排序(Heap Sort)
- [Java--常见排序算法]--堆排序 (Heap Sort)
- 堆排序(Heap Sort)算法学习
- Insertion or Heap Sort PAT甲级真题(堆排序)
- 堆排序(Heap Sort)算法学习
- 选择排序(2)——堆排序(heap sort)
- 堆排序 heapSort
- 排序1+4:归并排序(MergeSort)和堆排序(HeapSort)
- 选择排序之堆排序(HeapSort)
- 排序算法之堆排序 Heap Sort
- 排序算法之堆排序(Heap Sort)
- Atitit 算法之道 attilax著 1. 第二部分(Part II) 排序与顺序统计(Sorting and Order Statistics) 1 2. 第六章 堆排序(Heapsort)
- 堆排序 (Heapsort)
- 经典算法(9)- 堆排序(Heapsort)
- 堆排序(heap sort)
- 堆排序(Heap Sort)原理及Java实现
- 堆排序(Heapsort)
- HeapSort -- 堆排序
- 第六章 堆排序(heapsort)
- 堆排序 HeapSort