快速排序中作为枢轴的第一个元素

First Element as pivot in Quick sort

本文关键字:第一个 元素 快速排序      更新时间:2023-10-16

为什么这段代码给我错了?在Quick sort中,我选择了第一个元素作为pivot:

我已经在纸上查到了,没有什么问题。

    private void QuickSort(ref int [] S ,int l,int h)
    {
        //partioning
        int pivot_index = l;
        int j = 0;
        int temp = 0;
        for(int i=l+1;i<=h;i++)
            if (S[pivot_index] > S[i])
            {
                j++;
                temp = S[i];
                S[i] = S[j];
                S[j] = temp;
            }
        pivot_index = j;
        temp = S[l];
        S[l] = S[j];
        S[j] = temp;
        //end partioning
        if (l < h && pivot_index>l && pivot_index<h)
        {
            QuickSort(ref S, l, pivot_index - 1);
            QuickSort(ref S, pivot_index + 1, h);
        }
    }

这是我的主菜:

        int[] List = get_input(textBox1.Text, ref n);
        //
        QuickSort(ref List, 0, n-1);

您的函数显然应该对数组中的[l, h]范围进行排序,但由于某种原因,您将元素编号i与元素编号j交换。后者(j)在[l, h]范围之外(它最初总是0,然后变成1、2、3,依此类推)。你想干什么?为什么要将元素交换到排序范围之外的某个完全无关的远程位置?

换句话说,在我看来,这根本不像是一种QuickSort风格的排序算法。您对j的无法解释的操作是您的实现无法真正排序任何内容的原因之一。

您的算法错误。获取枢轴值int pivot = S[pivot_index];

然后确定要交换的两个元素。因此,从左侧确定第一个元素,该元素大于或等于枢轴值。由此得到CCD_ 8。然后确定右侧的第一个元素,该元素小于或等于枢轴值。由此得到CCD_ 9。只要i小于j,则交换S[i]S[j]并重复该过程。

只有在没有更多的交换之后,看看是否可以递归地调用QuickSort。此处,必须对左侧部分和右侧部分进行两次单独的if检查。


另外,请注意,最好将中间的元素作为枢轴元素。如果元素应该预先排序或按降序排序,则QuickSort将执行得更好。

int pivot = S[(l+h)/2];