堆排序(算法导论)

来源:互联网 发布:淘宝贪吃飒 编辑:程序博客网 时间:2024/05/18 00:56


堆数据结构用于排序算法中,空间复杂度O(1),时间复杂度O(NlogN),但是在实践中还是不如快速排序(好像快速排序可以更好的利用硬件特性)。堆的意义就在于:最快的找到最大,在堆结构中插入一个值重新构造堆结构,取走最大/最下值后重新构造堆结构 其时间复杂度为O(logN),而其他方法最少为O(N).

heapsort过程的时间复杂度是O(nlgn),每次调用build_max_heap的时间复杂度为O(n),而n-1次调用max_heapify,每次的时间为O(lgn)


#include<iostream>#include<cmath>using namespace std;int n;int a[1000];int heap_size;//求父结点,左右儿子结点int parent(int i){return i>>1;}int left(int i){return i<<1;}int right(int i){return (i<<1)+1;}//维护最大堆得性质,,,根节点最大,它的子结点以此类推void max_heapify(int* a,int i){int larget;int l = left(i);int r = right(i);if(l<=heap_size && a[l]>a[i])larget = l;elselarget = i;if(r<=heap_size && a[r]>a[larget])larget = r;if(larget!=i){swap(a[i],a[larget]);max_heapify(a,larget);}}//建堆,,,,在非叶子的地方建结点void build_max_heap(int* a){int i;heap_size = n;for(i = floor(n/2);i>=1;i--)max_heapify(a,i);}void heapsort(int* a){build_max_heap(a);int i;for(i=n;i>=2;i--){swap(a[1],a[i]);heap_size--;max_heapify(a,1);}}int main(){cin>>n;for(int i=1;i<=n;i++)cin>>a[i];heapsort(a);for(int j=1;j<=n;j++)cout<<a[j]<<" ";cout<<endl;return 0;}



0 0
原创粉丝点击