题目
已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过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]
解析
class ScaleSort {
public:
vector<int> sortElement_1(vector<int> A, int n, int k) {
// write code here
sort(A.begin(), A.end());
return A;
}
void headAdjust(vector<int> &src,int root,int size) //调整为小顶堆;必须加引用,传地址
{
int temp = src[root];
for (int child = 2 * root + 1; child < size;child=2*child+1)
{
if (child+1<size&&src[child]>src[child+1]) //右孩子小
{
child++;
}
if (temp<src[child])
{
break;
}
src[root] = src[child];
root = child;
}
src[root] = temp;
return;
}
vector<int> sortElement(vector<int> A, int n, int k) {
// write code here
if (n==0||n<k)
{
return A;
}
vector<int> B; //含有k个元素
for (int i = 0; i < k;i++)
{
B.push_back(A[i]);
}
//创建小顶堆,即调整堆得过程
for (int i = k / 2-1; i >= 0;i--)
{
headAdjust(B,i,k);
}
for (int i = k; i < n;i++)
{
A[i - k] = B[0]; //交换堆顶元素
B[0] = A[i];
headAdjust(B, 0, k);
}
//最后k个元素堆排序
for (int i = n - k; i < n; i++)
{
A[i] = B[0];
swap(B[k-1],B[0]);
headAdjust(B, 0, --k);
}
return A;
}
};
题目来源