堆排序

 1 /*
2 * Author: Tanky Woo
3 * Blog: www.WuTianQi.com
4 * Data: 2010.12.20
5 * Note: 堆排序(Heap Sort)
6 */

7 #include <iostream>
8 using namespace std;
9
10 // 输出当前堆的排序状况
11 void PrintArray(int data[], int size)

12 {
13 for (int i=1; i<=size; ++i)
14 cout <<data[i]<<"";
15 cout<<endl;
16 }
17
18 // 堆化,保持堆的性质
19 // MaxHeapify让a[i]在最大堆中"下降",
20 // 使以i为根的子树成为最大堆
21 void MaxHeapify(int *a, int i, int size)

22 {
23 int lt = 2*i, rt = 2*i+1;
24 int largest;
25 if(lt <= size && a[lt] > a[i])
26 largest = lt;
27 else
28 largest = i;
29 if(rt <= size && a[rt] > a[largest])
30 largest = rt;
31 if(largest != i)
32 {
33 int temp = a[i];
34 a[i] = a[largest];
35 a[largest] = temp;
36 MaxHeapify(a, largest, size);
37 }
38 }
39
40 // 建堆
41 // 自底而上地调用MaxHeapify来将一个数组a[1..size]变成一个最大堆
42 //
43 void BuildMaxHeap(int *a, int size)

44 {
45 for(int i=size/2; i>=1; --i)
46 MaxHeapify(a, i, size);
47 }
48
49 // 堆排序
50 // 初始调用BuildMaxHeap将a[1..size]变成最大堆
51 // 因为数组最大元素在a[1],则可以通过将a[1]与a[size]互换达到正确位置
52 // 现在新的根元素破坏了最大堆的性质,所以调用MaxHeapify调整,
53 // 使a[1..size-1]成为最大堆,a[1]又是a[1..size-1]中的最大元素,
54 // 将a[1]与a[size-1]互换达到正确位置。
55 // 反复调用Heapify,使整个数组成从小到大排序。
56 // 注意: 交换只是破坏了以a[1]为根的二叉树最大堆性质,它的左右子二叉树还是具备最大堆性质。
57 // 这也是为何在BuildMaxHeap时需要遍历size/2到1的结点才能构成最大堆,而这里只需要堆化a[1]即可。
58 void HeapSort(int *a, int size)

59 {
60 BuildMaxHeap(a, size);
61 PrintArray(a, size);
62
63 int len = size;
64 for(int i=size; i>=2; --i)
65 {
66 int temp = a[1];
67 a[1] = a[i];
68 a[i] = temp;
69 len--;
70 MaxHeapify(a, 1, len);
71 cout << "中间过程:";
72 PrintArray(a, size);
73 }
74
75 }
76
77 int main()
78 {
79 int size;
80 int arr[100];
81 cout << "Input the num of elements:\n";
82 cin >> size;
83 cout << "Input the elements:\n";
84 for(int i=1; i<=size; ++i)
85 cin >> arr[i];
86 cout << endl;
87 HeapSort(arr, size);
88 cout << "最后结果:";
89 PrintArray(arr, size);
90 }

 

posted on 2012-02-25 15:55  万里心晴  阅读(135)  评论(0编辑  收藏  举报