240
功不唐捐,玉汝于成😡。

堆排序

#include<bits/stdc++.h>

using namespace std;


void adjust_sort(int a[],int x,int n)//对长度为n的区间,第x个结点进行调整
{
    int l=2*x+1;
    int r=2*x+2;//左右子树
    int max=x;
    if(l<n&&a[l]>a[max])max=l;
    if(r<n&&a[r]>a[max])max=r;
    if(max!=x)//如果最大值不是x 那跟最大的孩子交换
    {
        swap(a[max],a[x]);//跟最大孩子交换
        adjust_sort(a,max,n);//交换完之后调整最大孩子以下的树
    }
}
void heap_sort(int a[],int n)
{
    for(int i=n/2-1;i>=0;i--)//由于数组从零开始,所以减一
        adjust_sort(a,i,n);
    for(int i=n-1;i>0;i--)
    {
        swap(a[0],a[i]);//因为是大根堆,最上边的值是最大的,所以将最大 的值放到最后边,然后调整剩余的值找下剩余数中最大值
        adjust_sort(a,0,i);//将剩余的值进行调整得到最大值
    }
}
本质就是:通过堆的性质找到最值,进行排序,大小根堆只是得到的最值不同,导致交换位置不同而已。时间复杂度为O(nlog(n)),顺序,逆序和随机数据的时间复杂度都差不多
int main ()
{
    int a[]={8,5,4,5,7,1};
    heap_sort(a,6);
    for(int i=0;i<6;i++)
        cout<<a[i]<<endl;
    return 0;
}

  对于5000个数据:                  比较次数:    移动次数:    运行所花时间:

posted @ 2019-12-16 17:21  BigXun  阅读(106)  评论(0编辑  收藏  举报