【问题标题】:How can I fix my java quick sort?如何修复我的 java 快速排序?
【发布时间】:2023-03-18 22:36:01
【问题描述】:

问题是,它是一个永无止境的递归。我不知道,我怎样才能完成递归。有趣的是,它有效,如果我打印 arraylist (mergedArray),它将在一些迭代后排序,但函数永远不会停止。 错误信息是:

“在 javaapplication9.QuickSort.simple_quick_sort(QuickSort.java:40)”

以下代码:

public ArrayList<Integer> simple_quick_sort(ArrayList<Integer> arr) {
    ArrayList<Integer> mergedArray = new ArrayList<Integer>();
    ArrayList<Integer> left = new ArrayList<Integer>();
    ArrayList<Integer> right = new ArrayList<Integer>();
    if (arr.size() <= 1) {
        return arr;
    }
    else {
        int pivot = arr.get(0);
        for (int i = 0; i < arr.size(); i++) {
            if (arr.get(i) < pivot) {
                left.add(arr.get(i));
            }
            else {
                right.add(arr.get(i));
            }
        }

    } 
    mergedArray.addAll(left);
    mergedArray.addAll(right);
    simple_quick_sort(mergedArray);
    return mergedArray;
}

【问题讨论】:

  • 您需要对leftright 部分进行排序并合并它们,而不是(再次)合并整个数组。
  • 注意 simple_quick_sort(mergedArray) 无论如何都会被调用,所以它会一直循环
  • pivot 应该是突出的,它不参与后续的排序。你应该确保你先了解快速排序。

标签: java recursion stack-overflow quicksort


【解决方案1】:
public ArrayList<Integer> simple_quick_sort(ArrayList<Integer> arr) {

  if (arr.size() <= 1) {
    return arr;
  }
  else {
    ArrayList<Integer> mergedArray = new ArrayList<Integer>();
    ArrayList<Integer> left = new ArrayList<Integer>();
    ArrayList<Integer> right = new ArrayList<Integer>();
    int pivot = arr.get(0);
    for (int i = 0; i < arr.size(); i++) {
        if (arr.get(i) < pivot) {
            left.add(arr.get(i));
            left = simple_quick_sort(left);
        }
        else {
            right.add(arr.get(i));
            right = simple_quick_sort(right);
        }
    }

  } 
  mergedArray.addAll(left);
  mergedArray.addAll(right);
}

当然,复制与快速排序的基本思想相反,这很好,因为它可以在要排序的数组上工作,不需要这些复制操作和存储分配。

【讨论】:

    【解决方案2】:

    很抱歉,您对快速排序的整个实现有点不正确。此外,在递归函数内部使用循环会否定使用递归的好处。如果你想实现那个循环,我建议你将它嵌套在另一个循环中以使代码更简单(不会像递归那样高效)。

    如果您想继续使用此程序,请尝试进行以下更改: 当你写

    simple_quick_sort(mergedArray);
    return mergedArray;
    

    您没有使用函数的返回值。您只是调用该函数,而对返回的值不做任何事情。在此代码生效之前,可能还有更多需要修复的地方。 如果你想了解更多关于快速排序和递归的知识,我找到了这个页面http://www.geeksforgeeks.org/quick-sort/

    我希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      相关资源
      最近更新 更多