用堆排序实现大致已经排好序的序列

已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。
给定一个int数组A,同时给定A的大小n和题意中的k,请返回排序后的数组。
测试样例:
[2,1,4,3,6,5,8,7,10,9],10,2
返回:[1,2,3,4,5,6,7,8,9,10]

可以利用堆排序,不超过k,每组选择k+1个数,从0开始,每组内进行建堆,建完最小堆之后最前面的元素就是最小值。之后下标加1,继续进行堆排序,时间复杂度可以达到(log(n+k))空间复杂度为O(1)因为使用循环实现最小堆,没用调用栈。不稳定排序。
代码如下:

class ScaleSort {
public:
    vector<int> sortElement(vector<int> A, int n, int k) {
        if(n<2)
            return A;  
        int i=0;
        for(;i+k<n;++i)
        {
            buildheap(A,i,k+1);           
        }

        while(n-i>1)
        {
        buildheap(A,i,n-i);
        i++;        
        }
        return A;
        // write code here
    }



    void buildheap(vector<int> &A,int begin,int k)
        {
        if(k<2)
            return;
        if(A[(k-2)/2+begin]>A[k-1+begin])
                swapnum(A[(k-2)/2+begin],A[k-1+begin]);

        if(k%2==1){
            if(A[(k-2)/2+begin]>A[k-2+begin])
             swapnum(A[(k-2)/2+begin],A[k-2+begin]);
        }
        for(int i=(k-4)/2;i>=0;--i)
            {
            if(A[i+begin]>A[2*i+1+begin])
                swapnum(A[i+begin],A[2*i+1+begin]);
            if(A[i+begin]>A[2*i+2+begin])
                swapnum(A[i+begin],A[2*i+2+begin]);
        }        
    }
    void swapnum(int &a,int &b)
        {
        int temp;
        temp=a;
        a=b;
        b=temp;        
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值