排序-堆排序

 1 #include<iostream>
 2 using namespace std;
 3 
 4 void swap(int arr[], int i, int j)
 5 {
 6     int temp = arr[i];
 7     arr[i] = arr[j];
 8     arr[j] = temp;
 9 }
10 
11 void heapify(int tree[], int n, int i)//n是结点总数,i是调整的结点数组下标
12 {
13     //函数heapify对元素tree[i]进行调整
14     if (i >= n)
15     {
16         return;        //递归出口
17     }
18 
19     int c1 = 2 * i + 1;
20     int c2 = 2 * i + 2;
21     int max = i;
22     if (c1<n&&tree[c1]>tree[max])
23     {
24         max = c1;
25     }
26     if (c2<n&&tree[c2]>tree[max])
27     {
28         max = c2;
29     }
30     if (max != i)
31     {
32         swap(tree, max, i);
33         heapify(tree, n, max);    //对下面的结点继续调整
34     }
35 }
36 
37 void build_heap(int tree[], int n)    //建立大根堆
38 {
39     int last_node = n - 1;
40     int parent = (last_node - 1) / 2;    //找到最后一个非叶子结点
41     int i;
42     for (i = parent; i >= 0; i--)    //不断向上调整
43     {
44         heapify(tree, n, i);
45     }
46 }
47 
48 void heap_sort(int tree[], int n)    //堆排序
49 {
50     build_heap(tree, n);
51     int i;
52     for (i = n - 1; i >= 0; i--)
53     {
54         swap(tree, i, 0);
55         heapify(tree, i, 0);//由于每次都会减少一个最大值结点,故用i
56     }
57 }
58 int main()
59 {
60     int tree[] = { 4,10,2,5,1,3,8,7,1};
61     int n = 9;
62     //heapify(tree, n, 0);
63     //build_heap(tree, n);
64     heap_sort(tree, n);
65     
66     for (int i = 0; i < n; i++)
67     {
68         cout << tree[i] << endl;
69     }
70 
71     system("pause");
72 }
原文地址:https://www.cnblogs.com/KBryant/p/11629097.html