2013-07-16 97 views
1

我写了下面的快速排序算法,但它抛出了堆栈溢出异常。 关于如何解决此问题的任何建议..quicksort算法抛出stackoverflow异常错误

static void Main(string[] args) 
    { 
     int[] input={17,12,6,19,23,8,5,10}; 
     QuickSort(input,0,7); 
     foreach (int item in input) 
     { 
      Console.WriteLine(item); 
     } 
    } 
    static void QuickSort(int[] input,int p , int r) 
    { 
     if (p<r) 
     { 
      int q=Partition(input, p, r); 
      QuickSort(input, p, q); 
      QuickSort(input, q, r); 
     } 
    } 
    static int Partition(int [] input,int p,int r) 
    { 
     int pivot = input[r];//pivot element 
     int i = p - 1; 
     int j = r + 1; 
     while (true) 
     { 
      do 
      { 
       i = i + 1; 
      } while (!(input[i]>=pivot)); 
      do 
      { 
       j = j - 1; 
      } while (!(input[j] <= pivot)); 
      //swap 
      if (i<j) 
      { 
       int temp = input[i]; 
       input[i] = input[j]; 
       input[j] = temp; 
      } 
      else 
      { 
       return j; 
      } 
     } 


    } 
+1

我建议您一步一步调试代码,并看看在您进行递归调用时'p','q'和'r'的值是如何改变的。基于这个错误,我猜他们没有改变,因为他们应该。 – carlosfigueira

+1

递归快速排序总是会冒吹堆栈的风险。但不是在8个元素的数组上。使用调试器来追踪发生了什么。 –

+0

提示:Partition()创建3个段,而不是2个。 –

回答

1

你快速排序的方法不会在情况下,它已经排序划分后停止。

private static void QuickSort(int[] input, int p, int r) { 
    if (p < r) { 
     int q = Partition(input, p, r); 
     if (q < r) { 
      QuickSort(input, p, q); 
      QuickSort(input, q, r); 
     } 
    } 
} 
+0

这看起来仍然很容易卡住。并产生未分类的输出。 –

+0

仍然溢出,不能再排序 –