1 #include "iostream" 2 #include "iomanip" 3 #include "time.h" 4 using namespace std; 5 6 #define num 28 7 typedef int type;//type类型为int 8 9 /*10 *调整数组A中以K为根的子序列为堆,其中最大的元素下标为m11 *假设以2k,2k+1为根的左右子树均是堆12 */13 void sift(type Array[],int k,int m)14 {15 int i,j,x;16 bool finished = false;17 18 x =Array[k];//临时保存当前根植19 i = k;//指示空位20 j = 2*i;//j先指向其左孩子结点21 while(j<=m &&!finished)//确定i结点不是叶子节点且搜索未结束22 {23 if((j =Array[j])finished = true;//若原根最大,置搜索和帅选结束标志25 else{26 Array[i] = Array[j];//大的孩子结点值上移27 i = j;//继续往下帅选:i指示新的空位,j相应改变28 j*=2;29 }30 }31 Array[i] = x;//将原根值填充到所搜索到的当前的空位置中32 }33 34 /*35 *对数组Array中下标为1~n的元素用堆排序算法实现排序36 */37 void Heap_Sort(type Array[],int n)38 {39 int i;40 time_t start,end;41 start = clock();42 for(i=n/2;i>=1;i--)43 {44 sift(Array,i,n);//建初始堆45 }46 for(i=n;i>=2;i--)//控制排序过程47 {48 type temp;49 temp = Array[1];50 Array[1] = Array[i];51 Array[i] = temp;52 sift(Array,1,i-1);//调整子序列Array[1]~Array[i-1]为堆53 }54 end = clock();55 cout<<"The Heap_Sorted Array:"<