gpt4 book ai didi

java - 卡在一个带有随机数据轴的简单快速排序实现中

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:02:22 24 4
gpt4 key购买 nike

我正在审查算法的东西,并陷入了一个简单的 java 快速排序算法实现

import java.util.Arrays;
import java.util.Random;

public class QuickSort {
int arr[];
boolean randomPick;
Random rand = null;

public QuickSort(int[] inputArray) {
arr = inputArray;
randomPick = false;
}

public QuickSort(int[] inputArray, boolean random) {
arr = inputArray;
if (random) {
randomPick = true;
rand = new Random(System.currentTimeMillis());
}
else {
randomPick = false;
}
}

public int[] sort() {
int start = 0;
int end = arr.length - 1;
try {
_sort(start, end);
}
catch (StackOverflowError e) {
System.out.println("StackOverflow: " + Arrays.toString(arr));
}
return arr;
}

private void _sort(int start, int end) {
int i = start;
int j = end;
int pivotLoc;
if (!randomPick) {
pivotLoc = (j + i) / 2;
}
else {
pivotLoc = rand.nextInt(j - i) + i;
}
int pivot = arr[pivotLoc];
while (i < j) { // swapping numbers around the pivot
while (arr[i] < pivot) {
i++;
}
while (arr[j] > pivot) {
j--;
}
if (i < j) {
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
i++;
j--;
}
}
if (i - start > 1) {
_sort(start, i);
}
if (end - i > 1) {
_sort(i, end);
}
}
}

代码可以选择中间的数字作为基准,也可以随机选择一个数字作为基准,并通过循环调用 _sort 对数组进行排序。它在第一种情况下有效,但在第二种情况下失败。

情况是:当到达一个子数组如这个{3,5,5}时,i==start==0,j==end==2。最后 5 和 5 交换,i 变成 2,j 变成 1(i++ 和 j--)。然后由于 i - start>1 它将一遍又一遍地调用 _sort 并最终引发 stackoverflow 错误。然而错误应该发生在第一种情况下(固定枢轴),到目前为止还没有发生......

我不知道我的代码有什么问题。我知道阅读别人编写的代码不是一件愉快的事,但有什么帮助吗?

最佳答案

你在递归条件中犯了一个小错误,startend 比较都是针对 i start 应该针对 j

你有:

    if (i - start > 1) {
_sort(start, i);
}
if (end - i > 1) {
_sort(i, end);
}

需要:

    if (j > start) {
_sort(start, j);
}
if (end > i) {
_sort(i, end);
}

并且您的ij 比较需要允许等于:

   // here ----v
if (i <= j) {
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
i++;
j--;
}

关于java - 卡在一个带有随机数据轴的简单快速排序实现中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12065910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com