《算法导论》(二)--堆排序
中间计算复杂度与递归式太晕了,看的不甚明白,现在自感功力不够,修为不够,以后回头再看。。
终于弄明白了堆排序的方法。。调整堆有点麻烦,记得时刻保持堆的性质就好了。。
1 #include <iostream>
2 using namespace std;
3 #define LENGTH 10
4
5 int heap_size=0,size=LENGTH;
6
7 void max_heapify(int array[],int i)
8 {//下标的问题要注意
9 int l=(i<<1)+1;
10 int r=(i<<1)+2;
11 int largest;
12
13 if(l<heap_size&&array[l]>array[i])
14 {
15 largest=l;
16 }
17 else
18 {
19 largest=i;
20 }
21
22 if(r<heap_size&&array[r]>array[largest])
23 {
24 largest=r;
25 }
26
27 if(largest!=i)
28 {
29 swap(array[i],array[largest]);
30 max_heapify(array,largest);
31 }
32 }
33
34 void build_max_heap(int array[])
35 {
36 heap_size=size;
37 for (int i=(size%2==0?size/2-1:size/2);i>=0;i--)
38 {//当对某结点调用MAX_heapify时,该结点的两棵子树都已是最大堆
39 //为什么不是从0开始??递归定义结构决定。
40 max_heapify(array,i);
41 }
42 }
43
44 void heap_sort(int array[])
45 {
46 build_max_heap(array);
47
48 for (int i=LENGTH-1;i>=1;i--)
49 {
50 swap(array[0],array[i]);
51 heap_size=heap_size-1;
52 size--;
53 max_heapify(array,0);//根结点下标为0
54 }
55 }
56
57 int main()
58 {
59 int array[]={4,1,3,2,16,9,10,14,8,7};
60 heap_sort(array);
61 for (int i=0;i<LENGTH;i++)
62 {
63 cout<<array[i]<<" ";
64 }
65 cout<<endl;
66 }