您的位置:首页 > 其它

排序算法——堆排序

2009-08-08 14:20 176 查看
主要设计操作:

(1)max_heap():调整堆使其保持堆性质

(2)build_heap():堆的建立

(3)sort_heap():堆排序

1 #include <iostream>
2 using namespace std;
3 #define N 10
4 //大顶堆的保持:
5 //a:数组
6 //i:节点i出可能不满足大顶堆的性质,需要调整
7 //n:此时堆中元素的个数,n<=N
8 void max_heap(int *a,int i,int n)
9 {
10         int l = 2*i+1;
11         int r = 2*i+2;
12         int large = 0;
13
14         while(l<n || r < n)//循环终止条件
15         {
16                 large = i;
17                 if(l<n && a[large] < a[l])
18                         large = l;
19                 if(r<n && a[large]<a[r])
20                         large = r;
21                 if(large == i)//当节点i本来就满足大顶堆性质时,不需要调整
22                         break;
23                 int tmp = a[large];
24                 a[large] = a[i];
25                 a[i] = tmp;
26                 i = large;
27                 l = 2*i+1;
28                 r = 2*i+2;
29         }
30 }
31 void build_heap(int *a)
32 {
33         int i = 0;
34         for(i=N/2-1;i>=0;i--)//从第一个非叶子节(N/2-1)点开始,通过自下向上调整每一个非叶子节点
35         {
36                 max_heap(a,i,N);
37         }
38 }
39 void sort_heap(int *a)
40 {
41         build_heap(a);//首先建立一个大顶堆
42         int i = 0;
43         i=N-1;
44         while(i>0)//将大顶堆的根节点和最后一个叶子节点交换,然后重新调整堆,使满足大顶堆性质
45         {
46                 int tmp = a[i];
47                 a[i] = a[0];
48                 a[0] = tmp;
49                 max_heap(a,0,i);
50                 i--;
51         }
52 }
53 int main()
54 {
55         int a[10]={3,5,0,0,0,9,12,1,2,7};
56         int i =0;
57         sort_heap(a);
58         for(i = 0;i<N;i++)
59                 cout << a[i] << " " ;
60         cout <<endl;
61 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: