需要掌握的知识:
大根堆
根节点的值始终大于孩子节点的值的树结构如下
时间复杂度为O(n*logn)
注意索引值从1开始,才有父节点索引=子节点索引值/2
大根堆
根节点的值始终大于孩子节点的值的树结构如下
然后每次用根节点与最后一个节点替换,并用剩下的节点构造大根堆9
/ /
8 6
/ / / /
7 1 4 2
/
3
时间复杂度为O(n*logn)
- #include <iostream>
- using namespace std;
- int cnt = 0; //计算次数
- void Output(int array[], int n)
- {
- printf("%d:/t/t ", cnt++);
- for (int i=1; i<n; i++)
- {
- printf("%d ", array[i]);
- }
- printf("/n");
- }
- void swap(int &a, int &b)
- {
- printf("%d <--> %d/n", a, b);
- int temp;
- temp = a;
- a = b;
- b = temp;
- }
- /*
- root从最下层的根开始排序,树的节点序号从1开始,左节点=2*根节点
- index为节点数
- 函数目的:建立大根堆(根节点始终大于孩子节点的树结构)
- */
- void CreateHeap(int array[], int root, int index)
- {
- int j;
- int temp;
- int finish;
- j = 2*root; //左孩子节点索引值
- temp = array[root]; //保存根节点
- finish = 0;
- while(j<=index && finish == 0)
- {
- if(j < index) //如果有右孩子
- if(array[j] < array[j+1]) //选出值大的节点
- j++;
- if(temp >= array[j]) //和父节点比较
- finish = 1;
- else //取出最大值的节点做父亲
- {
- array[j/2] = array[j];
- j = 2*j; //递归左节点
- }
- }
- array[j/2] = temp;
- }
- int main()
- {
- int a[9] = {0,7,9,6,8,1,2,4,3};
- for(int k=8; k>0; k--)
- {
- a[9-k] = k+1;
- }
- for(int i=(8/2); i>0; i--)
- {
- CreateHeap(a, i, 8);
- Output(a,9);
- }
- for(int j=8; j>1; j--)
- {
- swap(a[j], a[1]);
- CreateHeap(a, 1, j-1);;
- Output(a,9);
- }
- return 0;
- }