以下程序是我在互联网上找到的快速排序算法的实现。
public class QuickSort {
private int array[];
private int length;
public void sortElements(int[] arrayvalues) {
if (arrayvalues == null || arrayvalues.length == 0) {
return;
}
this.array = arrayvalues;
length = arrayvalues.length;
doQuickSort(0, length - 1);
}
private void doQuickSort(int lowIndex, int highIndex) {
int i = lowIndex;
int j = highIndex;
int pivot = array[lowIndex + (highIndex - lowIndex) / 2];
// now Divide the array into two arrays(actually we are maintaining single array only)
while (i <= j) {
while (array[i] < pivot) {
i++;
}
while (array[j] > pivot) {
j--;
}
if (i <= j) {
swapElements(i, j);
//move index to next position on both sides
i++;
j--;
}
}
// call quickSort() method recursively
if (lowIndex < j) {
doQuickSort(lowIndex, j);
}
if (i < highIndex) {
doQuickSort(i, highIndex);
}
}
private void swapElements(int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
public static void main(String a[]) {
QuickSort quicksort = new QuickSort();
int[] inputarray = {32, 1, 23, 14, 43, 7, 6, 65};
System.out.println("Before sorting");
for (int i : inputarray) {
System.out.print(i);
System.out.print(" ");
}
quicksort.sortElements(inputarray);
System.out.println("After sorting");
for (int i : inputarray) { //Problem line
System.out.print(i);
System.out.print(" ");
}
}
}
一切都很好,直到最后一个块,排序后打印数组。 for循环再次在inputarray上运行。 inputarray在main中定义,然后传递给sortElements,它被分配给在程序开始时定义的全局数组。所有后续操作都在该全局数组上执行。那么应该在最后一个for循环中打印出来吗?如何对全局数组进行的操作反映在inputarray上?
答案 0 :(得分:0)
写作时
this.array = arrayvalues;
您实际上并未复制arrayvalues
:您只是将this.array
指向与arrayvalues
指向相同的数组(它们都只是引用)。
因此,当您更改this.array
的元素时,您也会更改arrayvalues
指向的数组元素,因为它是同一个对象。
如果您真的想要复制arrayvalues
,请执行以下操作:
this.array = Arrays.copyOf(arrayvalues, arrayvalues.length);
现在他们指向不同的数组,因此对一个数据的更新不会反映在另一个数组中。
然而,为什么你想要的却不是很清楚:如果你确实需要副本,QuickSort
类中的更新不是反映在输入数组中:基本上,您无法看到sortElements
方法已更改的内容。
因此,我会问你为什么不希望代码以目前的方式工作。