推薦:
某cppblog
wutianqi'sblog
堆排序實現:
#include <iostream>using namespace std; // 輸出當前堆的排序狀況void PrintArray(int data[], int size){ for (int i=1; i<=size; ++i) cout <<data[i]<<" "; cout<<endl;} // 堆化,保持堆的性質// MaxHeapify讓a[i]在最大堆中"下降",// 使以i為根的子樹成為最大堆void MaxHeapify(int *a, int i, int size){int lt = 2*i, rt = 2*i+1;int largest;if(lt <= size && a[lt] > a[i])largest = lt;elselargest = i;if(rt <= size && a[rt] > a[largest])largest = rt;if(largest != i){int temp = a[i];a[i] = a[largest];a[largest] = temp;MaxHeapify(a, largest, size);}} // 建堆// 自底而上地調用MaxHeapify來將一個數組a[1..size]變成一個最大堆//注意:不能唯寫MaxHeapify(a, 1, size),因為這樣只會對左子樹或右子樹建堆,應該從下至上建堆!void BuildMaxHeap(int *a, int size){for(int i=size/2; i>=1; --i)MaxHeapify(a, i, size);} // 堆排序// 初始調用BuildMaxHeap將a[1..size]變成最大堆// 因為數組最大元素在a[1],則可以通過將a[1]與a[size]互換達到正確位置// 現在新的根項目破壞了最大堆的性質,所以調用MaxHeapify調整,// 使a[1..size-1]成為最大堆,a[1]又是a[1..size-1]中的最大元素,// 將a[1]與a[size-1]互換達到正確位置。// 反覆調用Heapify,使整個數組成從小到大排序。// 注意: 交換隻是破壞了以a[1]為根的二叉樹最大堆性質,它的左右子二叉樹還是具備最大堆性質。// 這也是為何在BuildMaxHeap時需要遍曆size/2到1的結點才能構成最大堆,而這裡只需要堆化a[1]即可。void HeapSort(int *a, int size){BuildMaxHeap(a, size);PrintArray(a, size); int len = size;for(int i=size; i>=2; --i){int temp = a[1];a[1] = a[i];a[i] = temp;len--;MaxHeapify(a, 1, len);cout << "中間過程:";PrintArray(a, size);} } int main(){int size;int arr[100];cout << "Input the num of elements:\n";cin >> size;cout << "Input the elements:\n";for(int i=1; i<=size; ++i)cin >> arr[i];cout << endl; HeapSort(arr, size);cout << "最後結果:"; PrintArray(arr, size);}