快速排序算法的问题

时间:2010-06-26 02:37:41

标签: c# algorithm sorting

我正在使用C#中的快速排序算法,但是我面临一个奇怪的问题,即在随机数执行算法的10次中,我得到了2或3个错误的排序答案。

我的意思是:这个代码可以排序大约7个例子中的7个;为什么?我无法弄清楚问题是什么,你能帮助我吗?

  public void quicksort(int[] data, int first, int n)
   { 
       int pivotIndex, n1, n2;
       if (n > 1)
       {
           pivotIndex= partition(data, first, n);
           n1 = pivotIndex-first;
           n2 = n -n1 -1;
           quicksort(data, first, n1);
           quicksort(data, pivotIndex+ 1, n2);
       }
   }

   private int partition(int[] data, int first, int n)
   {
       int t;
       int pivot= data[first], tooBigIndex=first+1, tooSmallIndex=first+n-1;
       while (tooBigIndex<= tooSmallIndex)
       {
        while( (tooBigIndex < n) && (data[tooBigIndex] <= pivot) )
                tooBigIndex++;
       while (data[tooSmallIndex] > pivot) 
            tooSmallIndex--;
           if (tooBigIndex< tooSmallIndex) 
           {
            t = data[tooBigIndex];
            data[tooBigIndex] = data[tooSmallIndex];
            data[tooSmallIndex] = t;
            tooSmallIndex--;
            tooBigIndex++;
           }
       }
       t= data[0];
       data[0]= data[tooSmallIndex] ;
       data[tooSmallIndex]=t;
       return tooSmallIndex;

   }
}

2 个答案:

答案 0 :(得分:8)

我对您发布的曾经的代码感到惊讶 - 甚至终止。测试:

(tooBigIndex < n) &&

应该显然是

(tooBigIndex < first + n) &&

和行中的索引:

   t= data[0];
   data[0]= data[tooSmallIndex];
   data[tooSmallIndex]=t;

应为first 0(使第一行无用,因为您可以省略它并使用pivot代替{{1}在第三行 - 但这是一个冗余,另外两个是可怕的错误; - )。

认为这是所有的错误,但我只测试了随机数组; - )。

答案 1 :(得分:3)

如果这是一个家庭作业问题,你应该这样做,这样我们就可以更好地定位援助(在正确的方向上更多的推动,而不是直接的解决方案)。

如果不是作业,则应考虑将IComparable接口与Array.sort()一起使用。对于提供IComparable接口的整数,您应该能够使用类似的东西:

int[] valArray = new int[6] { 1, 5, 2, 6, 9, 7 };
Array.Sort (valArray);                            // <-- This is all you need.
String s = "";
foreach (int val in valArray)
    s += "," + val;
MessageBox.Show (s.Substring(1));

导致:

1,2,5,6,7,9

我很确定它使用了QuickSort。重新发明轮子是一个坏主意,很好用于教育目的,但是,如果意图是(如你所示)只能对数组进行排序,请使用语言提供的功能并节省你自己的努力。