• 堆排序


    #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个数据:                  比较次数:    移动次数:    运行所花时间:

  • 相关阅读:
    第52周二Restful
    第52周一
    第51周日
    第51周六
    第51周五
    第51周四
    第51周三
    第51周二
    第51周一
    第50周日
  • 原文地址:https://www.cnblogs.com/zwx7616/p/12050183.html
Copyright © 2020-2023  润新知