执行这部分C#代码后会有什么样的行为?

时间:2016-11-12 22:13:35

标签: c# .net sorting quicksort

我试图实现快速排序算法。但是当我创建方法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);
        }
    }

1 个答案:

答案 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)之后,修改后的参数会保持修改,因为它的引用类型与字符串不同。