//堆排序---大根堆 //此过程只排出第一个大根堆 void HeapAdjust(int data[],int s,int m) { //data[s..m]组成的元素序列中,除data[s]之外,其余元素均满足堆定义 //调整data[s]的位置,使之成为大根堆 int j,t; t = data[s]; //备份元素data[s],找到合适的位置后再插入 for (j=2*s+1;j<m;j=j*2+1) //沿值较大的孩子节点往下筛选 { if(j<m && data[j]<data[j+1]) //j是较大的元素的下标 ++j; if(!(t<data[j])) break; data[s] = data[j]; s = j; } data[s] = t; } //用堆排序对整形数组进行非递减排序 //对n个数组元素进行排序 void HeapSort(int data[],int n) { int i; int t; for(i=n/2-1;i>=0;--i) //把data调整成大根堆 HeapAdjust(data,i,n-1); for (i=n-1;i>0;--i) { t = data[0]; data[0] = data[i]; data[i] = t; //堆顶元素data[0]与序列的最后元素data[i]交换 HeapAdjust(data,0,i-1); //带排元素个数减一,将data[0...i-1]调整为大根堆 } }