【算法导论】堆排序
堆排序的原理:
构建并且维持一个最大堆,然后交换堆的第一个和最后一个元素,每次交换后最大的元素都被移到最后。然后堆的规模减一,继续交换,直到进行到第二个元素。这时排序完成
图解:(图片来源于http://blog.163.com/zhoumhan_0351/blog/static/399542272009918112712205/)
算法分析:
维持一个最大堆的复杂度为?(lgN),建立一个最大堆的复杂度为?(N),Heap_sort过程调用了一次Build_Heap, n-1次Max_Heap。总的复杂度为?(N‘l‘g‘N)
C++源代码:
1 #include <iostream> 2 #include <algorithm> 3 4 using namespace std; 5 6 //维护堆的性质,使堆都能维持为最大堆 7 void Max_Heap(int *a, int i, int size) 8 { 9 int l = 2 * i; //得到左孩子 10 int r = 2 * i + 1; //得到又孩子 11 int max; 12 13 if (l <= size && a[l] > a[i]){ 14 max = l; 15 } 16 else 17 max = i; 18 if (r <= size && a[r] > a[max]){ 19 max = r; 20 } 21 if (max != i){ 22 swap(a[i], a[max]); 23 Max_Heap(a, max, size); 24 } 25 } 26 27 //建立一个最大堆 28 void HeapBUild(int *a, int size){ 29 int i; 30 for (i = size / 2; i >= 1; i--){ 31 Max_Heap(a, i, size); 32 } 33 } 34 35 //堆排序 36 void HeapSort(int *a, int size){ 37 int i; 38 HeapBUild(a, size); //先建立一个最大堆 39 for (i = size; i >= 1; i--){ 40 swap(a[1], a[i]); //交换第一个和最后一个元素 41 Max_Heap(a, 1, i - 1); // size-1,递归 42 } 43 } 44 45 int main(int argc, char *argv[]){ 46 int i; 47 int a[] = { 0, 16, 20, 3, 11, 17, 8 }; 48 int size = 7; 49 HeapSort(a, size); 50 for (i = 1; i <= size; i++) 51 cout << a[i - 1] << " "; 52 return 0; 53 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。