【问题标题】:Java Quicksort (array values not changing values when reassigned)Java Quicksort(重新分配时数组值不改变值)
【发布时间】:2015-12-05 03:45:26
【问题描述】:

问题:
我用 Java 写了一个快速排序算法。当我尝试这个案例时: {4, 3, 1, 2, 0},我得到 {0,2,1,3,4}

所以,我开始单步调试调试器,看看出了什么问题,并注意到当我到达代码中的某个部分时,数组值的重新分配被完全忽略(红色圈出):

此时应该取intArray[1]并使其等于2,然后使intArray[3]等于pivot值。但是,它完全忽略了这两行代码。

我尝试了其他一些情况(如下)以确保这不是我传递变量或类似的方式(但它们使用相同的代码工作得很好):

   private final static int[] intArray = new int[]{4, 8, 1, 6, 3, 7, 2, 5};
   private final static int[] intArray = new int[]{11,10,9,8,7,6,5,4,3,2,1};
   private final static int[] intArray = new int[]{1,2,3,4,5};

问题:
是否有一些关于 Java 数组重新分配的事情我不应该在这里做,这可能会导致问题?如果没有,有人可以指出正确的方向吗?

完整代码:

 package quicksort;

/**
 * @date December 4, 2015
 */
public class Quicksort {
    private final static int[] intArray = new int[]{4, 3, 1, 2, 0};


    /**
     * @purpose This method partitions the array and subarrays based on the current pivot point
     * @param pivot
     * @param leftPointer
     * @param rightPointer 
     */
private static void partition(int pivot, int leftPointer, int rightPointer) {

    while (leftPointer <= rightPointer) {
        if (pivot < intArray[rightPointer]) {
            rightPointer--;
        } else if (pivot > intArray[rightPointer]) {
            intArray[leftPointer] = intArray[rightPointer];
            intArray[rightPointer] = pivot;
            leftPointer++;
        } else if (intArray[leftPointer] > pivot) {
            intArray[rightPointer] = intArray[leftPointer];
            intArray[leftPointer] = pivot;
            rightPointer--;
        } else {
            leftPointer++;
        }

    }
    for (int x = 0; x <= intArray.length - 1; x++) {
        System.out.print(intArray[x] + " ");
    }
    System.out.println();

}

/**
 * @purpose This method recursively runs the partition method for the array and subarrays
 * @param pivot
 * @param leftPointer
 * @param rightPointer 
 */
private static void quicksort(int pivot, int leftPointer, int rightPointer) {

    while (rightPointer != 0) {
        partition(intArray[0], 0, rightPointer);
        rightPointer--;
    }

    while (leftPointer != intArray.length - 1) {
        leftPointer++;
        partition(intArray[leftPointer], leftPointer, intArray.length - 1);
    }

}

/**
 * @purpose Runs the Quicksort class
 * @param args the command line arguments
 */
public static void main(String[] args) {
    int leftPointer = 0;
    int rightPointer = intArray.length - 1;
    int pivot = intArray[0];
    quicksort(pivot, leftPointer, rightPointer);

}

}

感谢您的建议!

【问题讨论】:

  • (这不是快速排序,因为 Mateo 已经回答了。它让人想起 shaker sort)。请在至少一个测试输入中包含重复值。
  • 好的。谢谢你俩。我清楚地看到我误解了如何实现算法。但是,这是否意味着在代码运行时应该跳过这两行代码?这对我来说仍然很奇怪。我应该将它作为一个新问题发布而不提及它应该是快速排序吗?
  • Should I post it as a new question without mentioning it is supposed to be quicksort IMO,您应该更新标题。)您在 one 时间点显示了一个状态,这使得很难了解可能出了什么问题 - 什么元素 [at index] 1 和 3 的值是否(在同一迭代中……)达到了第二个条件/第 34 行?

标签: java arrays algorithm quicksort


【解决方案1】:

我知道您不希望 sb 为您提供好的代码,因为它可以在 Internet 上轻松找到。我假设您想知道您的代码有什么问题。

我找不到任何递归。快速排序包括对数组进行分区,将其分成两个较小的数组并对它们进行快速排序(递归)。

您的 Quicksort 函数进行了一次奇怪的迭代,每次处理从 0 到 sth 或从 sth 到结尾的数组,这是不正确的。更何况你在(sth,left,right)上调用Quicksort,但是在Quicksort的定义(或者body,我不知道怎么用英文命名:part{...})中你处理更大的数组,即从0到右。这很不清楚。

快速排序的左右参数是必要的,因为它是递归调用的,并且在每次调用时它都在数组的不同部分起作用。您只调用一次 Quicksort。

【讨论】:

  • 感谢您的解释。我发现了我在价值观方面所做的事情。我无法复制我原来的错误,所以我一定误解了我的问题(除了没有编写真正的快速排序算法)。
猜你喜欢
  • 2016-06-07
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 2021-11-08
相关资源
最近更新 更多