堆排序(最大堆)
2017-06-11 22:23
155 查看
首先堆是什么?
堆是一种完全二叉树。
现在我们要利用堆进行排序操作,所以需要的是一种特殊的完全二叉树最大堆。
(当然用最小堆也可以做到,方法是每次取出h[1]的数,然后将h
赋值给h[1],同时 n--,不断的进行这个操作直到堆空)
用最大堆的做法就是
1 建立一个最大堆
2 将h[1]与h
交换,同时n-- //因为h[1]必定是最大值
3 维护最大堆
4 重复2,3操作
那么我们就能得到一个从小到大排序好的h数组。
并且时间复杂度只有O(nlogn)
因为在交换的过程中只是在父亲和儿子间进行。
这里再说一下堆数组的建立,如果 i是父亲,那么它的儿子为 i*2和i*2+1,在堆中,非叶子结点一定存在左儿子。
并且编号最大的非叶子结点是 n/2.
代码:
堆是一种完全二叉树。
现在我们要利用堆进行排序操作,所以需要的是一种特殊的完全二叉树最大堆。
(当然用最小堆也可以做到,方法是每次取出h[1]的数,然后将h
赋值给h[1],同时 n--,不断的进行这个操作直到堆空)
用最大堆的做法就是
1 建立一个最大堆
2 将h[1]与h
交换,同时n-- //因为h[1]必定是最大值
3 维护最大堆
4 重复2,3操作
那么我们就能得到一个从小到大排序好的h数组。
并且时间复杂度只有O(nlogn)
因为在交换的过程中只是在父亲和儿子间进行。
这里再说一下堆数组的建立,如果 i是父亲,那么它的儿子为 i*2和i*2+1,在堆中,非叶子结点一定存在左儿子。
并且编号最大的非叶子结点是 n/2.
代码:
#include<stdio.h> #include<string.h> #include<time.h> #include<stdlib.h> #define MAX 16 int h[20]; void swap(int &a,int &b) { int t=a; a=b; b=t; } void updateheap(int i,int len) { int flag=0; //判断节点是否还需下移 int t; while(!flag&&i*2<=len) { if(h[i]<h[i*2]) //更新左子树 { t=i*2; } else t=i; if(i*2+1<=len) //更新右子树 { if(h[t]<h[i*2+1]) t=i*2+1; } if(t==i) //判断是否需要下降 flag=1; else { swap(h[i],h[t]); i=t; //当前结点移动 } } } void bulidheap(int len) //堆的建立 { for(int i=MAX/2;i>=1;i--) //从最大非叶子结点开始维护 { updateheap(i,len); //维护最大堆 } } void heapsort(int len) { while(len>1) { swap(h[1],h[len]); //把最大值放到最后 len--; //删除最大值 updateheap(1,len); // 维护最大堆 } } void print() { for(int i=1;i<=MAX;i++) printf("%d ",h[i]); printf("\n"); } int main() { srand(time(0)); printf("原始序列\n"); for(int i=1;i<=MAX;i++) { h[i]=10+(rand()%90); printf("%d ",h[i]); } printf("\n"); bulidheap(MAX); heapsort(MAX); printf("堆排序\n"); print(); }
相关文章推荐
- 最大堆排序
- 最大堆实现堆排序
- C++实现堆、最大堆、最小堆 -- 堆排序插入删除操作
- leetcode 628. Maximum Product of Three Numbers(C语言,堆排序,计算最大乘积)33
- 堆排序(最大堆[1])--【算法导论】
- 找出N个数据中的最大的K个数据---堆排序
- 《github一天,一个算术题》:堆算法接口(堆排序、堆插入和堆垛机最大的价值,并删除)
- 算法导论-----------堆排序研究 (堆排序原理及算法实现(最大堆))
- 算法入门--堆排序(最大堆,从小到大排序)
- C++实现数组最大堆排序
- 堆排序原理及算法实现(最大堆)
- 堆排序_最大优先队列
- 寻找最大的K个数之堆排序(1)
- 最近在写的赫夫曼树、B树、二项堆等都会用到堆排序,所以把最大堆排序和最小堆排序一次性先给大家看看
- 最大堆与堆排序
- 最大堆实现堆排序
- 堆排序(最大堆进阶)--【算法导论】
- 最大(小)堆和堆排序简介
- 大数据处理堆实现N个数据找K个最大数据和堆排序
- 用堆排序寻找数组中最大的K个数