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为根的子序列为堆,其中最大的元素下标为m
11 *假设以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<m)&&(Array[j]<Array[j+1]))j++;//让j指向左右孩子中的最大者
24 if(x>=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:"<<endl;
56 for(i=1;i<=n;i++)
57 {
58 cout<<setw(5)<<Array[i]<<" ";
59 if(i%10==0)cout<<endl;
60 }
61 cout<<endl;
62
63 cout<<"performnace time:";
64 cout<<(double)(end - start )/1000<<"Seconds"<<endl;
65 }
66 int main()
67 {
68 type Array[num+1];
69 int i;
70 cout<<"Initialize Array:"<<endl;
71 for(i=1;i<=num;i++)
72 {
73 Array[i] = rand()%1000;
74 cout<<setw(5)<<Array[i]<<" ";
75 if(i%10==0)cout<<endl;
76 }
77 cout<<endl;
78 Heap_Sort(Array,num);
79 return 0;
80 }
![](https://images2015.cnblogs.com/blog/836979/201512/836979-20151204135804533-156288423.jpg)