#include<iostream> using namespace std; void AdjusHeap(int arr[], int i, int n) { int s = i; int x = i*2; int y = x+1; if (x < n && arr[s] < arr[x]) s = x; if (y < n && arr[s] < arr[y]) s = y; if (s != i) { swap(arr[i], arr[s]); AdjusHeap(arr, s, n); } } void BuildHeap(int arr[], int n) { for (int i = n/2-1; i >=0; i--) AdjusHeap(arr, i, n); } void HeapSort(int arr[], int n) { BuildHeap(arr, n); while (n > 1) { swap(arr[0], arr[n-1]); n--; AdjusHeap(arr, 0, n); } } int main() { int arr[10]; for (int i=0; i<5; i++) cin>>arr[i]; HeapSort(arr, 5); for (int i=0; i<5; i++) cout<<arr[i]<<" "; }
#include<iostream> using namespace std; void AdjusHeap(int arr[], int i, int end){//与父节点比较 int x=i*2+1;//左 int y=x+1;//右 int s=i;//父 while (x<end||y<end){ if (x<end&&arr[s]<arr[x]) s=x; if (y<end&&arr[s]<arr[y]) s=y; if (s!=i){ swap(arr[i], arr[s]); i=s; x=i*2+1; y=x+1; } else break; } } void BuildHeap(int arr[], int end){//建立树 for (int i=end/2-1; i>=0; i--){ AdjusHeap(arr, i, end); } } void HeapSort(int arr[], int end){//根节点与最后一个交换 BuildHeap(arr, end); while(end>1) { swap(arr[0], arr[end-1]); end--; AdjusHeap(arr, 0, end); } } int main() { int arr[10]; for (int i=0; i<5; i++) cin>>arr[i]; HeapSort(arr, 5); for (int i=0; i<5; i++) cout<<arr[i]<<" "; }
参考:http://www.cnblogs.com/Anker/archive/2013/01/23/2873422.html