2014-01-18 32 views
0

如何使函數返回排序數組的結果?c#quicksort字符串數組類

class quiksort 
{ 
    public static char[] qsort(char[] items) 
    { 
     return qs(items, 0, items.Length - 1); 
    } 

    // A recursive version of Quicksort for characters. 
    static char[] qs(char[] items, int left, int right) 
    { 
     int i, j; 
     char x, y; 

     i = left; j = right; 
     x = items[(left + right)/2]; 

     do 
     { 
      while ((items[i] < x) && (i < right)) i++; 
      while ((x < items[j]) && (j > left)) j--; 

      if (i <= j) 
      { 
       y = items[i]; 
       items[i] = items[j]; 
       items[j] = y; 
       i++; j--; 
      } 
     } while (i <= j); 

     if (left < j) 
     { 
      return qs(items, left, j); 
     } 
     if (i < right) 
     { 
      return qs(items, i, right); 
     } 
    } 
} 

錯誤表示不是所有的代碼路徑都返回一個值嗎?這是什麼意思

+0

你有兩個if條件,但如果沒有滿足條件,那麼在這種情況下你沒有返回任何東西。 –

+0

是的,我剛纔看到它。我剛剛返回了空值。嗯,但沒有輸出顯示當我運行代碼 – arukiri123

+0

...現在,你有一個排序算法,考慮使用它不僅字符。使其通用。 :-)然後你的方法簽名可能看起來像'static T [] qs (T [] items,int left,int right)其中T:IComparable '。你只需要用'T'和'''用'IComparable'中的'CompareTo()'方法來替換'char'。 – mvo

回答

2

問題出在你的第二種方法。由於錯誤指出所有代碼路徑必須返回一個值。你有你的回報陳述在if陳述之內。即使其中的一個將始終執行,編譯器也不在意,就其而言,您的方法不會返回任何內容。您需要添加一個返回值作爲函數的最後一行。

static char[] qs(char[] items, int left, int right) 
    { 
     int i, j; 
     char x, y; 

     i = left; j = right; 
     x = items[(left + right)/2]; 

     do 
     { 
      while ((items[i] < x) && (i < right)) i++; 
      while ((x < items[j]) && (j > left)) j--; 

      if (i <= j) 
      { 
       y = items[i]; 
       items[i] = items[j]; 
       items[j] = y; 
       i++; j--; 
      } 
     } while (i <= j); 

     if (left < j) 
     { 
      return qs(items, left, j); 
     } 
     if (i < right) 
     { 
      return qs(items, i, right); 
     } 
     return //whatever is most appropriate in the case that you arrive here 
    } 

我不確定你真正想要返回的值是什麼,所以我會把它留給你。如果您希望在發生錯誤時只能到達那裏,那麼我可能會使用null

+0

如果發生錯誤,您也可以拋出適當的異常(InvalidOperationException,ArgumentException),而不是返回null。但在這種情況下,最好不要返回任何東西(void),因爲你也在改變輸入。 – mvo

1

evanmcdonnal的回答對錯誤是正確的。

更普遍的是,它的混亂有一種方法採取char[]參數,改變char[],然後返回一個char[](相同char[],但並不明顯,從剛纔的簽名。

如果」如果你只是返回void,很明顯你會改變char[]作爲參數傳遞

相反,如果你打算返回一個有序的數組,然後返回一個新的數組,並保留你未被改變的那個。

+0

有關如何構建代碼的良好的一般性建議,可能比僅僅添加我說的代碼更好,以使編譯器錯誤消失。 – evanmcdonnal