八种排序整理(六)----堆排序
基本概念:堆排序是一種特殊的樹形數(shù)據(jù)結(jié)構(gòu),其每個(gè)節(jié)點(diǎn)都有一個(gè)值,通常提到的堆都是指一棵完全二叉樹,
根節(jié)點(diǎn)的值小于(或大于)兩個(gè)子節(jié)點(diǎn)的值,同時(shí)根節(jié)點(diǎn)的兩個(gè)子樹也分別是一個(gè)堆。堆排序主要包括兩個(gè)過程:
一是構(gòu)建堆, 二是交換堆頂元素與最后一個(gè)元素的位置。
?
堆排序思想:
1.?? 將序列構(gòu)造成一棵完全二叉樹 ;
2.?? 把這棵普通的完全二叉樹改造成堆,便可獲取最小值 ;
3.?? 輸出最小值 ;
4.?? 刪除根結(jié)點(diǎn),繼續(xù)改造剩余樹成堆,便可獲取次小值 ;
5.?? 輸出次小值 ;
6.?? 重復(fù)改造,輸出次次小值、次次次小值,直至所有結(jié)點(diǎn)均輸出,便得到一個(gè)排序 。
?
堆排序的特點(diǎn):
穩(wěn)? 定? 性:不穩(wěn)定
時(shí)間復(fù)雜度:O(nlogn)
堆排序?qū)τ涗涊^少的文件效果一般,但對(duì)于記錄較多的文件很有效果,其運(yùn)行時(shí)間主要耗費(fèi)在創(chuàng)建堆與調(diào)整堆上。
?
1 #include <iostream> 2 3 using namespace std; 4 5 void AdjustMinHeap(int *a, int pos, int len) 6 { 7 int temp; 8 int child; 9 10 for (temp = a[pos]; 2 * pos + 1 <= len; pos = child) 11 { 12 child = 2 * pos + 1; 13 if (child < len && a[child] > a[child + 1]) 14 { 15 child++; 16 } 17 if (a[child] < temp) 18 { 19 a[pos] < a[child]; 20 } 21 else 22 { 23 break; 24 } 25 } 26 a[pos] = temp; 27 } 28 29 void Swap(int a, int b) 30 { 31 int temp; 32 temp = a; 33 a = b; 34 b = temp; 35 } 36 37 void PrintArray(int *a, int length) 38 { 39 int i; 40 41 for (i = 0; i < length; i++) 42 { 43 printf("%d ", a[i]); 44 } 45 printf("\n"); 46 } 47 48 void HeapSort(int *array, int len) 49 { 50 int i; 51 52 for (i = len / 2 - 1; i >= 0; i--) 53 { 54 AdjustMinHeap(array, i, len - 1); 55 } 56 for (i = len -1; i >= 0; i--) 57 { 58 Swap(array[0], array[i]); 59 AdjustMinHeap(array, 0, i - 1); 60 } 61 } 62 63 int main() 64 { 65 int array[] = {0, 13, 1, 14, 27, 18}; 66 int length = sizeof(array) / sizeof(array[0]); 67 68 HeapSort(array, length); 69 PrintArray(array, length); 70 while(1); 71 return 0; 72 }?
轉(zhuǎn)載于:https://www.cnblogs.com/kutoli/p/8337907.html
總結(jié)
以上是生活随笔為你收集整理的八种排序整理(六)----堆排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一章 docker 镜像,容器,仓库基
- 下一篇: 数人云牵手红帽Ansible:七大最佳实