堆排序分析
来源:互联网 发布:网络信息发布规范 编辑:程序博客网 时间:2024/05/18 15:51
堆排序分析
时间复杂度:平均情况,O(nlogn);最好情况 ,O(nlogn);最差情况,O(nlogn)。
空间复杂度,O(1)。
代码:
#include <iostream>#include <vector>#include <cfloat>using namespace std;void maxheapify(vector<double> & A, int i, int heapsize){ int l = 2*i + 1; int r = 2*i + 2; int largest; if(l < heapsize && A.at(l) > A.at(i) ) { largest = l; } else { largest = i; } if(r < heapsize && A.at(r) > A.at(largest) ) { largest = r; } if(largest != i) { double tmp = A.at(i); A.at(i) = A.at(largest); A.at(largest) = tmp; maxheapify(A, largest, heapsize); }}void build_max_heap(vector<double> & A){ int heapsize = A.size(); for(int i=A.size()/2-1; i>=0; i--) { maxheapify(A, i, heapsize); }}void heapsort(vector<double> & A, int & heapsize){ build_max_heap(A); for(int i=A.size()-1; i>0; i--) { double tmp = A.at(0); A.at(0) = A.at(i); A.at(i) = tmp; heapsize--; maxheapify(A, 0, heapsize); }}int main(int argc, char ** argv){ double arr[] = {4, 1, 3, 2, 16, 9, 10, 14, 8, 7}; vector<double> A(arr, arr+10); for(int i=0; i<A.size(); i++) cout<<A.at(i)<<" "; cout<<"\n\n"; int heapsize = A.size(); heapsort(A, heapsize); for(int i=0; i<A.size(); i++) cout<<A.at(i)<<" "; cout<<endl; return 0;}基本思想:堆排序中的数据结构“堆”事实上就是完全二叉数。如果从小到大排列数组中的数,则需要建大顶堆。所谓大顶堆,就是完全二叉数中父亲都不小于孩子。排序的自始至终,都要维护一个大顶堆,否则就要进行调整。
时间复杂度分析:
调整堆的时间复杂度:O(logn)
建堆的时间复杂度:调整堆时作用在高度为h的结点上的时间是O(h)。第h层节点数目有
堆排序时间复杂度:O(n) + (n-1)O(logn) = O(n)
注意:
1)建立初始大顶堆的时候需要调用调整堆的算法。
2)调整堆算法的输入是两个大顶堆,这两个大顶堆分别是某一个结点的左子树和右子树。
3)建堆时从最后一个内结点开始从下往上到根结点进行;调整堆时自顶向下进行。
4)堆的大小初始为数组大小,随着调整大顶堆算法的每一次完成逐渐递减。
5)调整好一个大顶堆后,将数根移到堆尾部,也就是数组中是从后往前、从大到小确定排序结果的。
0 0
- 堆排序算法分析
- 堆排序分析
- 堆排序及其分析
- 堆排序及其分析
- 堆排序及其分析
- 堆排序及其分析
- 堆排序算法分析
- 堆排序及其分析
- 堆排序算法分析
- 堆排序及其分析
- 堆排序分析
- 堆排序及其分析
- 堆排序分析
- 堆排序分析
- 堆排序算法分析
- 算法分析:堆排序
- 堆排序及算法分析
- 堆排序分析------简单明晰
- 关于页面布局
- iOS app crash日志分析
- Akka学习笔记07--TypedActor(有类型的Actor)
- [leetcode] 10 Regular Expression Matching
- eclipse 皮肤 换肤
- 堆排序分析
- 如何访问android的asset目录和res目录下的文件
- hdu 4884 TIANKENG’s rice shop && BestCoder Round #2 1002
- Linux挂载数据盘
- HTML5用canvas绘制心形线
- git patch
- 屏障I/O处理
- SQL SERVER与C#的数据类型对应表
- C#中1窗口引用2窗口控件的方法