【问题标题】:What behaviour would be after executing this part of C# code?执行这部分 C# 代码后会有什么行为?
【发布时间】:2017-03-26 21:08:08
【问题描述】:

我正在尝试实现快速排序算法。但是当我创建方法 quickSort 并给出一个 arrayToSort 和两个整数高低作为参数时,我有一个小问题。在该方法中,我正在调用另一个方法partition(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);
        }
    }

【问题讨论】:

    标签: c# .net sorting quicksort


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 1970-01-01
      • 2016-02-22
      相关资源
      最近更新 更多