我试图实现快速排序算法。但是当我创建方法quickSort并给出params一个arrayToSort和两个高和低的整数时,我有一个小问题。在方法I&#旁边39; m调用另一个更改数组的方法分区(arrayToSort,low,high)(交换一些元素或smth。并不重要),之后我用递归方式调用相同的方法quickSort参数:arrayToSort,low,high(作为head方法的参数,在顶部排列的相同数组。)。作为参数的数组将采用递归调用方法quickSort?首先排列的数组,或者由前一个方法改变的数组?
public static void quickSort(int[] arrayToSort,int low,int high){
int pivotLocation = 0;
if (low < high) {
pivotLocation = partition (arrayToSort, low, high);
quickSort (arrayToSort, low, pivotLocation - 1);
quickSort (arrayToSort, pivotLocation + 1, high);
}
}
答案 0 :(得分:0)
在pivotLocation = partition (arrayToSort, low, high);
之后,arrayToSort
被修改(如果满足某些条件),因为在调用partition (arrayToSort, low, high)
之后进行递归方法调用,然后它们将修改后的数组作为参数。
这发生在每个递归级别,在函数中进行第一次递归调用,然后在第二次递归调用之后进行。
原因不是使用了递归,而是因为分区方法中的逻辑,其中排序是通过在满足正确条件时更改位置的值来完成的。
您的分区代码可能类似于:
public static int partition(int[] arrayToSort, int low, int high)
{
int pivot = arrayToSort[low];
while (true)
{
while (arrayToSort[low] < pivot)
{
low++;
}
while (arrayToSort[high] > pivot)
{
high--;
}
if (low < high)
{
var temp = arrayToSort[high];
arrayToSort[high] = arrayToSort[low];
arrayToSort[low] = temp;
}
else
{
return high;
}
}
}
你可以看到:
var temp = arrayToSort[high];
arrayToSort[high] = arrayToSort[low];
arrayToSort[low] = temp;
修改了arrayToSort。在调用partition (arrayToSort, low, high)
之后,修改后的参数会保持修改,因为它的引用类型与字符串不同。