1
/*
2
* 堆排序
3
* O(nlgn)
4
*/
5
6
#include <iostream>
7
#include <cstdlib>
8![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
9
#define LEFT(i) (2*i+1)
10
#define RIGHT(i) (2*i+2)
11
#define PARENT(i) ( (i-1)/2 )
12![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
13
using namespace std;
14![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
15
//交换两个元素值
16
void swap(int& a, int& b);
17
//输出数组元素
18
void print(int*a, int n);
19![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
20
//保持堆性质,当左右子树都是堆时,但a[i]可能违反堆性质时,调整成堆
21
void MaxHeapify(int *a, int i, int n)
22
{
23
int left = LEFT(i);
24
int right = RIGHT(i);
25
int largest = i;
26
27
if(left < n && a[left] > a[largest] )
28
largest = left;
29
if(right < n && a[right] > a[largest])
30
largest = right;
31
if(largest != i)
32
{
33
swap(a[i],a[largest]);
34
MaxHeapify(a,largest,n);
35
}
36
}
37![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
38
//创建堆
39
void BuildMaxHeap(int* a, int n)
40
{
41
//从有子树的开始
42
for(int i = PARENT(n-1); i >= 0; i--)
43
{
44
MaxHeapify(a,i,n);
45
}
46
}
47![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
48
void HeapSort(int *a, int n)
49
{
50
//创建堆
51
BuildMaxHeap(a, n);
52
for(int i = n -1; i >= 1; i--)
53
{
54
//把最大元素放在最后,下一步不予考虑
55
swap(a[i],a[0]);
56
MaxHeapify(a,0,i); //这里不是MaxHeapify(a,0,i-1);
57
}
58
}
59![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
60![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
61
//交换两个元素值
62
void swap(int& a , int& b)
63
{
64
int temp = a;
65
a = b;
66
b = temp;
67
}
68![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
69
//打印数组
70
void print(int* a , int n)
71
{
72
for(int i = 0; i < n ; i++)
73
cout << a[i] << ",";
74
cout << endl;
75
}
76![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
77![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
78
int main()
79
{
80
const int N = 10;
81
int a[N] = {4,1,3,2,16,9,10,14,8,7};
82
83
print(a,N);
84
85
HeapSort(a,N);
86
87
print(a,N);
88
89
system("pause");
90
return 0;
91
}
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
2
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
3
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
4
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
5
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
6
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
7
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
8
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
9
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
10
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
11
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
12
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
13
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
14
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
15
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
16
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
17
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
18
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
19
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
20
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
21
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
22
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
23
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
24
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
25
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
26
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
27
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
28
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
29
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
30
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
31
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
32
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
33
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
34
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
35
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
36
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
37
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
38
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
39
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
40
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
41
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
42
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
43
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
44
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
45
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
46
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
47
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
48
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
49
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
50
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
51
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
52
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
53
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
54
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
55
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
56
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
57
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
58
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
59
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
60
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
61
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
62
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
63
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
64
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
65
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
66
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
67
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
68
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
69
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
70
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
71
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
72
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
73
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
74
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
75
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
76
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
77
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
78
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
79
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
80
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
81
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
82
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
83
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
84
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
85
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
86
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
87
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
88
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
89
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
90
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
91
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)