java快速排序时间限制

问题描述 投票:0回答:1

这段代码有时工作正常,但在某些测试中

s Time Limit. What
是错误?

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} 这样的短数组

s ok, but if it
是 40 或 100 个数字 -> TimeLimit。我创建分区算法,并采用随机主元。之后,我检查随机数是否等于 min,然后更改它。我计算迭代次数并对左侧和右侧进行快速排序。

java quicksort time-limiting
1个回答
0
投票

当被分区的(子)数组仅重复相同的值时,例如 [2, 2, 2] 或 [5, 5],以下循环将永远不会退出:

    while (A[x] == Z) {
        x = (int)(Math.random() * (r - l + 1) + l);
    }
© www.soinside.com 2019 - 2024. All rights reserved.