Java 快速排序时间限制

java quick sort time limit

提问人:Форс 提问时间:9/30/2023 更新时间:9/30/2023 访问量:49

问:

此代码有时可以正常工作,但在某些测试中,它是时间限制。有什么错误?

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

Java 快速排序 时间限制

评论


答:

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
这回答了你的问题吗?