已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过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;
}
}
}
};