小范围排序

已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。

给定一个int数组A,同时给定A的大小n和题意中的k,请返回排序后的数组。

class ScaleSort {
public:
    vector<int> sortElement(vector<int> A, int n, int k) {
        // write code here
        if(n<1||k<0||k>=n)
            return A;
        vector<int> minHeap(k);
        for(int i=0;i<k;i++)
        {
            minHeap[i]=A[i];
        }
        for(int i=k/2;i>=0;i--)
        {
            adjust(minHeap,i,k);
        }
        for(int i=0;i<n-k;i++)
        {
            A[i]=minHeap[0];
            minHeap[0]=A[i+k];
            adjust(minHeap,0,k);
        }
        for(int i=n-k;i<n;i++)
        {
            A[i]=minHeap[0];
            swap(minHeap[0],minHeap[k-1]);
            adjust(minHeap,0,--k);
        }
        return A;
    }
    
    void adjust(vector<int> &A,int parent,int n)
    {
        if(parent>n)
            return;
        int  child=2*parent+1;
        while(child<n)
        {
            if(child+1<n&&A[child+1]<A[child])
                child++;
            if(A[child]<A[parent])
            {
                swap(A[child],A[parent]);
                parent=child;
                child=2*parent+1;
            }
            else
            {
                break;
            }
        }
    }
    
};


猜你喜欢

转载自blog.csdn.net/zrh_CSDN/article/details/80336513