这个QuickSort程序有什么问题?

时间:2011-11-05 21:56:14

标签: c# algorithm

我编写了一个基于伪代码的QuickSort算法。 我现在已经运行了大约4个小时的输出,我似乎无法找到我的算法开始脱轨的确切原因。这种收集逻辑是我所挣扎的。

无论如何,每当我运行我的程序时,有3种可能的结果:

  1. 该列表已整理并且100%正确。
  2. 该列表有90%有组织,一对或两对元素已关闭。
  3. 列表永远不会排序,导致无限循环。
  4. 鉴于我的结果,它让我相信某些事情与我正在使用的index变量有关。但是,我可以'弄清楚它为什么或出了什么问题。

    这是我用于QuickSort算法的所有代码:

    public void QuickSort(IList<int> list, int l, int r)
        {
            if (l>=r) return; 
            int index = Partition(list, l, r);
            Console.WriteLine("index: " + index);
            QuickSort(list, l, (index-1));
            QuickSort(list, (index+1), r);
        }
    
        public int Partition(IList<int> list, int l, int r)
        {
            int pivot = list[l];
            int i = l;
            int j = r + 1;
            do 
            {
                do { i++; } while(i < list.Count && list[i] < pivot);
                do { j--; } while(j > 0 && list[j] >= pivot);
                Swap(list, i, j);
            } while(i<j);
            Swap(list, i ,j);
            Swap(list, j, l);
            return j;
        }
    
        public void Swap(IList<int> list, int i, int j)
        {
            //Console.WriteLine("Swapping [i] " + list[i] + " with [j] " + list[j]);
            //PrintList(list, i, j, false);
            int temp = list[i];
            list[i] = list[j];
            list[j] = temp;
            //PrintList(list, j, i, true);
    
        }
    

    PrintList仅用于测试我的输出。

    以下是输入/输出示例:

    INPUT: [18,43,5,73,59,64,6,17,56,63]

    输出:[5,6,18,17,43,59,56,63,64,73]

2 个答案:

答案 0 :(得分:2)

您的分区方法存在一个问题:

    int i = l;
    int j = r + 1;
    do 
    {
        do { i++; } while(i < list.Count && list[i] < pivot);
        do { j--; } while(j > 0 && list[j] >= pivot);
        Swap(list, i, j);
    } while(i<j);

如果您使用l == 0输入,则第一次通过循环时会增加i,并且选中的第一项是list[1]。您可能希望这些do循环为while循环。

另一个问题是你无条件地在你的循环中交换list[i]list[j],即使是list[i] <= list[j]。您可能应该在进行交换之前进行检查。

这不会解决你所有的问题,但它会指出你正确的方向。

答案 1 :(得分:1)

public int Partition(IList<int> list, int l, int r){
    int pivot = list[l];
    int i = l+1;
    int j = r;
    while(true){
        //{i,j| l< i,j <= r}
        while(i<=r && list[i] <  pivot)++i;
        while(j>l  && list[j] >= pivot)--j;
        if(i<j)
            Swap(list, i, j);
        else
            break;
    }
    Swap(list, l, j);
    return j;
}