排序-堆排序

Posted kbryant

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序-堆排序相关的知识,希望对你有一定的参考价值。

 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 

 

以上是关于排序-堆排序的主要内容,如果未能解决你的问题,请参考以下文章

排序算法:堆排序-Java实现

[ 数据结构 -- 手撕排序算法第七篇 ] 堆及其堆排序

排序算法总结之堆排序

重温基础算法内部排序之堆排序法

重温基础算法内部排序之堆排序法

选择排序(简单选择排序和堆排序)