Java 快速排序(数组值在重新分配时不改变值)
Java Quicksort (array values not changing values when reassigned)
问题:
我在 Java 写了一个快速排序算法。当我尝试这个案例时:
{4, 3, 1, 2, 0},我得到 {0,2,1,3,4}
所以,我开始单步调试调试器看看哪里出了问题,并注意到当我到达代码的某个部分时,数组值的重新分配被完全忽略(红色圆圈):
此时应该取intArray[1]使其等于2,然后使intArray[3]等于枢轴值。但是,它完全忽略了这两行代码。
我尝试了其他几个案例(如下)以确保这不是我传递变量或类似东西的方式(但它们使用相同的代码工作得很好):
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);
}
}
感谢任何建议!
我知道您不希望 sb 向您提供好的代码,因为它可以很容易地在 Internet 上找到。我假设您想知道您的代码有什么问题。
我找不到任何递归。快速排序包括对数组进行分区,将其分成两个较小的数组并对它们进行快速排序(递归)。
您的 Quicksort 函数进行了一次奇怪的迭代,每次处理一个从 0 到 sth 或从 sth 到末尾的数组,这是不正确的。更重要的是,你在 (sth,left,right) 上调用 Quicksort,但在 Quicksort 的定义(或主体,我不知道如何用英文命名:part{...})中你处理更大的数组,即从0到右。这个很不清楚。
Quicksort 的左参数和右参数是必需的,因为它是递归调用的,并且在每次调用时它都作用于数组的不同部分。您只调用一次快速排序。
问题:
我在 Java 写了一个快速排序算法。当我尝试这个案例时:
{4, 3, 1, 2, 0},我得到 {0,2,1,3,4}
所以,我开始单步调试调试器看看哪里出了问题,并注意到当我到达代码的某个部分时,数组值的重新分配被完全忽略(红色圆圈):
此时应该取intArray[1]使其等于2,然后使intArray[3]等于枢轴值。但是,它完全忽略了这两行代码。
我尝试了其他几个案例(如下)以确保这不是我传递变量或类似东西的方式(但它们使用相同的代码工作得很好):
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);
}
}
感谢任何建议!
我知道您不希望 sb 向您提供好的代码,因为它可以很容易地在 Internet 上找到。我假设您想知道您的代码有什么问题。
我找不到任何递归。快速排序包括对数组进行分区,将其分成两个较小的数组并对它们进行快速排序(递归)。
您的 Quicksort 函数进行了一次奇怪的迭代,每次处理一个从 0 到 sth 或从 sth 到末尾的数组,这是不正确的。更重要的是,你在 (sth,left,right) 上调用 Quicksort,但在 Quicksort 的定义(或主体,我不知道如何用英文命名:part{...})中你处理更大的数组,即从0到右。这个很不清楚。
Quicksort 的左参数和右参数是必需的,因为它是递归调用的,并且在每次调用时它都作用于数组的不同部分。您只调用一次快速排序。