#include <iostream> using namespace std; void swap( int k[], int i,int j ) { int temp; temp = k[i]; k[i] = k[j]; k[j] = temp; } void HeapAdjust( int k[], int s,int n ) { int i,temp; temp = k[s];//存放当前要调整的结点 for( i=2*s; i <= n;i*=2 )//2*s就是左孩子 2*s+1就是右孩子 i*=2表示调到下一个树 { if( i < n && k[i] < k[i+1] )//确定不是最后一个结点 和 如果右孩子要大过左孩子 { i++; } if( temp >= k[i]) { break; } k[s] = k[i]; s = i; } k[s] = temp; } void HeapSort( int k[], int n ) { int i; for( i=n/2; i > 0;i-- ) // { HeapAdjust( k, i, n );//调整大顶堆 k表示数组 i表示双亲结点 n个数 } for( i=n; i > 1;i-- ) { swap(k, 1, i);//互换 元素 HeapAdjust( k, 1, i-1 ); } } int main() { int i ,a[10] = {-1,5,2,6,0,3,9,1,7,4}; HeapSort(a,9); for( i=1; i < 10 ;i++ ) { cout << a[i]; } cout << endl; return 0; }