2016-11-12 94 views
0

我试图实现快速排序算法。但我有一个小问题,当我创建方法quickSort和作为params一个arrayToSort和两个整数高和low.Inside该方法我打电话给另一个方法分区(arrayToSort,low,high)改变数组(交换一些元素或smth。无关紧要),然后我递归调用具有相同参数的同一个方法quickSort:arrayToSort,low,high(同一个数组它被设置在顶部,作为head方法的参数)。什么数组作为参数将采用递归调用方法quickSort?首先安排的数组,还是由前一个方法改变的数组?执行这部分C#代码后会有什么行为?

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

pivotLocation = partition (arrayToSort, low, high);后,arrayToSort被修改(如果某些条件得到满足),所以因为递归方法调用partition (arrayToSort, low, high)然后他们采取改性阵列的呼叫作为paramater后作出的。 这发生在函数的第一次递归调用和第二次递归调用的每个递归级别。 原因并不是使用递归,而是因为分区方法中的逻辑,当满足正确的条件时,通过值改变位置来完成排序。

你的分区代码可能是这样的:

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