【问题标题】:How to make pivot element generic inside Quicksort?如何在快速排序中使枢轴元素通用?
【发布时间】:2023-03-04 20:24:01
【问题描述】:

我正在尝试使用快速排序对文件中存在的 100k 元素进行排序。我的算法仅在我将第一个元素用作枢轴时才有效。如何使枢轴元素对程序通用?选择枢轴元素的最佳方法是什么使用快速排序?枢轴元素是依赖于数据还是我们实时使用任何特定算法?

void quicksort(int *temp,int p,int r)
{
    if(r > p + 1)
    {
        int piv = temp[p];
        int left = p + 1;
        int right = r;
        while(left < right)
        {
            if(temp[left] <= piv)
                left++;
            else
                swap(&temp[left], &temp[--right]);
        }
        swap(&temp[--left], &temp[p]);
        quicksort(temp, p, left);
        quicksort(temp, right, r);
    }
}

【问题讨论】:

    标签: c sorting pivot quicksort


    【解决方案1】:

    对您的枢轴选择的限制是它需要相当快。常见的方法是选择第一个元素、选择中间元素或随机选择一个元素。

    使用随机元素可能是最好的,因为即使对于已经排序的列表,它仍然倾向于快速排序(使用第一个元素在排序列表上的表现会很差,因为以下所有元素都会落在一边枢轴)。

    使用中间元素也是相当安全的,除非你的列表有一些奇怪的非标准顺序,比如你可以通过连接两个以相反顺序排序的列表来找到。

    我建议随机选择。

    我的算法只有在我使用第一个元素作为枢轴时才有效

    当你这么说时,你的意思是如果你的枢轴不是第一个元素,它会产生一个错误排序的列表吗?能说的详细点吗?

    【讨论】:

    • 是的,如果我不将我的枢轴作为第一个元素,则列表无法正确排序。
    • 如果你想选择一个不同的元素作为枢轴,你可以用新的枢轴和第一个元素进行就地交换。
    • 算法中如何实现?
    猜你喜欢
    • 2011-08-31
    • 2019-11-23
    • 2020-03-15
    • 2021-04-19
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2015-05-04
    • 2017-07-11
    相关资源
    最近更新 更多