写出下边问题完整且精准的Java代码 在算法中,有各种各样的排序算法,例如归并排序,冒泡排序,快速排序等等。本题中,我们会使用一种新的排序算法: K排序。 K排序算法描述如下:首先,算法需要按照某种规则选择该数列上至多K个位置,将其对应的数抽出来,其他的数都往左对齐,之后这K个数排好序之后依次放在原数列末尾。以上过程算作一 次操作。例如,对于数列[1,3,5,4,2],当K= 2时可以选择数字5和4,之后数列变成[1,3,2,4,5]。你的任务是:对于给定的数列,你需要计算出最少需要多少次上述操作,使得整个数列从小到大排好序? 输入描述: 第一行一个正整数T,表示有T组数据。 对于每组数据,第一行输入两个正整数n,k;第二行输入n个数....n.该序列是个1~n的排列。 对于所有数据: 1小于等于k小于等于n小于等于100000;1≤ai≤n, ai不等于aj; 1≤T≤5。 输出描述:对于每组数据,输出一行一个整数,表示答案。
时间: 2023-05-31 17:01:51 浏览: 93
排序算法(JAVA语言):冒泡排序,插入排序,选择排序,归并排序,快速排序
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int t = scanner.nextInt();
while (t-- > 0) {
int n = scanner.nextInt();
int k = scanner.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = scanner.nextInt();
}
PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
int ans = 0;
for (int i = n - 1; i >= 0; i--) {
if (pq.size() == k) {
ans++;
int temp = nums[i];
nums[i] = pq.poll();
pq.offer(temp);
} else {
pq.offer(nums[i]);
}
}
while (!pq.isEmpty()) {
nums[--n] = pq.poll();
}
System.out.println(ans);
}
}
}
阅读全文