1. HeapSort : 选择排序、不稳定排序
2. Time Complexity : O(nlongn)
3. Step:
1. 最大堆调整
2. 创建最大堆
3. 堆排序
4. Code:
1 void HeapAdjust(int src[], int i, int len) 2 { 3 int l = 2 * i + 1; //左孩子 4 int r = 2 * i + 2; //右孩子 5 int largest = 0; 6 7 if (l < len && src[l] > src[i]) 8 largest = l; 9 else 10 largest = i; 11 12 if (r < len && src[r] > src[largest]) 13 largest = r; 14 15 if (largest != i) { 16 int tmp; 17 18 tmp = src[i]; 19 src[i] = src[largest]; 20 src[largest] = tmp; 21 22 HeapAdjust(src, largest, len); //swap可能破坏原来已是最大堆的子树,递归调整子树 23 } 24 } 25 26 void HeapSort(int src[], int len) 27 { 28 int i; 29 30 for (i = len / 2; i >= 0; --i) 31 HeapAdjust(src, i, len); //创建最大堆,len/2以后全为叶子节点,即已为最大堆,则调整len/2前的节点 32 33 for (i = len - 1; i >=0; i--) { 34 int tmp; 35 36 tmp = src[i]; 37 src[i] = src[0]; 38 src[0] = tmp; 39 40 len--; 41 HeapAdjust(src, 0, len); //递归排序,每次递归找出最大数,有序数加一,len-- 42 } 43 }