#include "stdafx.h" #include <iostream> #include <assert.h> using namespace std; //对于a来说,除了a[s]之外均满足大顶堆的定义 // 该函数将下标 s到m 调整为大顶堆 void heapAdjust(int* a,int s, int m) { int temp = a[s]; // 下标从0开始,则两个孩子分别为 2*i+1 和 2*i+2 for(int j=2*s+1; j<=m; j=j*2+1) { // 执行完成后j中保存了两个孩子中较大的孩子的下表 // 如果j=m,说明m是最后的左孩子 if(j<m && a[j] < a[j+1]) j++; if(temp>=a[j])// s就是要插入的位置 break; //否则进行调整,将孩子中较大的孩子,放入s的位置 // 并将j赋值给s a[s] = a[j]; s = j; } a[s] = temp; } int main() { int a[] = {49,38,65,97,76,13,27,49}; int length = sizeof(a)/sizeof(a[0]); // 从最后一个没有孩子的节点进行调整,建立大顶推 for(int i= (length-1)/2 ; i>=0; i--) heapAdjust(a,i,length-1); // 将堆顶元素和最后一个元素进行交换 // 之后,重新调整堆 // 完成之后,就是 从小到大的排序 for(int i = length-1; i>0; i--) { int temp = a[0]; a[0] = a[i]; a[i] = temp; heapAdjust(a,0,i-1); } for(int i=0; i<length; i++) cout<<a[i]<<endl; }