堆排

先给出个慢不错的堆排博客:http://www.cnblogs.com/kkun/archive/2011/11/23/2260286.html

 

关于最大堆:最大堆中的堆并非指堆栈的堆,而是另一种数据结构。最大堆是一种特殊的完全二叉树,其还满足所有父亲节点不小于其左右儿子这个条件。显然堆顶元素为最大元素。

 

堆排可以分为三步:

1. 将待排序数组建立成最大堆

2. 取当前堆顶元素加入已就序数组

3. 维护2中除去堆顶元素的最大堆

 

代码:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 const int MAXN=1e6+10;
 5 
 6 void heapadjust(int array[MAXN], int i, int length){//维护最大堆
 7     int l;
 8     for(; i*2+1<length; i=l){
 9         int l=i*2+1;//左儿子
10         if(l<length-1&&array[l+1]>array[l]){
11             l++;//若右儿子大于左儿子,令右儿子为左儿子
12         }
13         if(array[i]<array[l]){
14             array[i]=array[l]^array[i];
15             array[l]=array[l]^array[i];
16             array[i]=array[l]^array[i];
17         }else break;
18     }
19 }
20 
21 void heapsort(int array[MAXN], int length){
22     for(int i=length/2-1; i>=0; i--){//初始时构建最大堆
23         heapadjust(array, i, length);
24     }
25     for(int i=length-1; i>0; i--){
26         array[i]=array[0]^array[i];//将堆顶元素加入已就序数组
27         array[0]=array[0]^array[i];
28         array[i]=array[0]^array[i];
29         heapadjust(array, 0, i);//缩小范围并调整最大堆
30     }
31 }
32 
33 int main(void){
34     int n, a[MAXN];
35     cin >> n;
36     for(int i=0; i<n; i++){
37         cin >> a[i];
38     }
39     heapsort(a, n);
40     for(int i=0; i<n; i++){
41         cout << a[i] << " ";
42     }
43     cout << endl;
44     return 0;
45 }
View Code

 

posted @ 2017-04-06 22:21  geloutingyu  阅读(321)  评论(0编辑  收藏  举报