Heap Sort
一、堆
1、(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树。树上的每一个结点对应数组中的一个元素。除了最底层外,该树是完全充满的,而且是从左向右填充。
2、在堆排序算法中,我们使用的是最大堆。最小堆通常用于构造优先队列。
3、如果把堆看成是一颗树,我们定义一个堆中的结点的高度就为该结点到叶结点最长简单路径上边的数目。进而我们可以把堆的高度定义为根节点的高度。
二、维护堆的性质
伪代码:
Max_Heapify(A,i)
{
l=LEFT(i);
r=RIGHT(i);
if(l<=A.heap_size && A[l]>A[i])
largest=l
else
largest=i;
if(r<=A.heap_size && A[r]>largest)
largest=r;
if(largest != i)
exchange A[i] with A[largest]
Max_Heapify(A,largest)
}
源代码:
void Max_Heapify(int a[],int i,int size)
{
int left=2*i;
int right=2*i+1;
int largest;
if(left<=size && a[left]>a[i])
largest=left;
else
largest=i;
if(right<=size && a[right]>a[largest])
largest=right;
if(largest!=i)
{
swap(a[i],a[largest]);
Max_Heapify(a,largest,size);
}
}
时间复杂度:O(logN)
三、建堆
当用数组表示存储n个元素的堆时,叶结点下标分别是|_ n/2 _|+1,|_ n/2 _|+2,...,n.
每个叶结点都可以看成只包含一个元素的堆。过程Build_Max_Heap对树中的其他结点都自底向上调用一次Max_Heapify.
伪代码:
Build_Max_Heap(A)
{
A.heap_size = A.length;
for i=|_ A.length/2 _| downto 1
Max_Heapify(A,i);
}
源代码:
void Build_Max_Heap(int a[],int size)
{
int i;
for(i=size/2;i>=1;i--)
Max_Heapify(a,i,size);
}
<span style="font-family:KaiTi_GB2312;font-size:24px;">时间复杂度:O(N)</span>
四、堆排序算法
伪代码:
Heap_Sort(A)
{
Build_Max_Heap(A);
for i=A.length downto 2
exchange A[1] with A[i];
A.heap_size=A.heap_size - 1;
Max_Heapify(A,1);
}
源代码:
void Heap_Sort(int a[],int size)
{
int i;
Build_Max_Heap(a,size);
for(i=size;i>=2;i--)
{
swap(a[1],a[i]);
size=size-1;
Max_Heapify(a,1,size);
}
}
时间复杂度:0(N*logN)
五、完整源代码:
1 //MAX_HEAP SOTR ALGORITHM
2
3 #include <iostream>
4 #include <algorithm>
5 using namespace std;
6
7 void Max_Heapify(int a[],int i,int size)
8 {
9 int left=2*i;
10 int right=2*i+1;
11 int largest;
12 if(left<=size && a[left]>a[i])
13 largest=left;
14 else
15 largest=i;
16 if(right<=size && a[right]>a[largest])
17 largest=right;
18 if(largest!=i)
19 {
20 swap(a[i],a[largest]);
21 Max_Heapify(a,largest,size);
22 }
23 }
24
25 void Build_Max_Heap(int a[],int size)
26 {
27 int i;
28 //int size=sizeof(a)/sizeof(int);
29 for(i=size/2;i>=1;i--)
30 Max_Heapify(a,i,size);
31 }
32
33 void Heap_Sort(int a[],int size)
34 {
35 int i;
36 Build_Max_Heap(a,size);
37 for(i=size;i>=2;i--)
38 {
39 swap(a[1],a[i]);
40 size=size-1;
41 Max_Heapify(a,1,size);
42 }
43 }
44
45 int main()
46 {
47 int i;
48 int len;
49 int a[100];
50 cout<<"Please input the length and a[]:"<<endl;
51 while(cin>>len)
52 {
53 for(i=1;i<=len;i++)
54 cin>>a[i];
55 //int size=sizeof(a)/sizeof(int);
56 //cout<<size;
57 Heap_Sort(a,len);
58 for(i=1;i<=len;i++)
59 cout<<a[i]<<" ";
60 cout<<endl;
61 }
62 return 0;
63 }
六、测试结果