2014-01-18 14 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