提问人:Форс 提问时间:9/30/2023 更新时间:9/30/2023 访问量:49
Java 快速排序时间限制
java quick sort time limit
问:
此代码有时可以正常工作,但在某些测试中,它是时间限制。
有什么错误?
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int[] A = new int[N];
for (int i = 0; i < N; i++) {
A[i] = in.nextInt();
}
QuickSort(A, 0, N - 1);
for (int j = 0; j < N; j++){
System.out.print(A[j] + " ");
}
}
public static int Partition(int[] A, int l, int r) {
int x = (int)(Math.random() * (r - l + 1) + l);
int Z = A[l];
for (int i = l; i <= r; i++) {
if (A[i] < Z) {
Z = A[i];
}
}
while (A[x] == Z) {
x = (int)(Math.random() * (r - l + 1) + l);
}
int C = l - 1;
for (int i = l; i <= r; i++) {
int y = A[i];
if (y >= A[x]) {
continue;
}
if (y < A[x]) {
int fake = A[C+1];
A[C+1] = A[i];
A[i] = fake;
++C;
}
}
return C + 1;
}
public static int[] QuickSort(int[] A, int l, int r){
if (r - l + 1 <= 1) {
return A;
}
if (l < r) {
int Index = Partition(A, l, r);
QuickSort(A, l, Index - 1);
QuickSort(A, Index, r);
}
return A;
}
}
我试图检查像 {3,2,1} 或 {3,7,4,2,1,9} 这样的短数组,它的 40 或 100 个数字 -> TimeLimit。我创建分区算法,并采取随机枢轴。在此之后,我检查随机数是否等于最小值,更改它。我计算迭代次数,并为左侧和右侧进行快速排序。s ok, but if it
答:
1赞
trincot
9/30/2023
#1
当被分区的(子)数组只有相同的重复值时,如 [2, 2, 2] 或 [5, 5],以下循环将永远不会退出:
while (A[x] == Z) {
x = (int)(Math.random() * (r - l + 1) + l);
}
您已经添加了此代码(以及要查找的循环),以避免分区剪切发生在最左侧,从而使调用方具有一个空分区和另一个与以前大小相同的分区。Z
但还有其他方法可以确保这一点。例如,您可以将 pivot 元素交换到(否则)空分区中。
今天又出现了一个关于随机枢轴选择的问题。那边的答案可能会给你带来启发。
评论
0赞
Форс
9/30/2023
我该如何改变这一点?如果我删除它,可能会发生一种情况,当枢轴等于最小 arr 时,它将是快速排序时的无限递归(索引 = l,并且 QuickSort (A,l,r) 返回 QuickSort (A,l,r)。
0赞
trincot
9/30/2023
请参阅“答案”的补充。
0赞
trincot
9/30/2023
这回答了你的问题吗?
评论