如何在Quicksort中使pivot元素通用?

时间:2012-09-07 22:00:25

标签: c sorting pivot quicksort

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

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);
    }
}

1 个答案:

答案 0 :(得分:1)

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

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

使用中间元素也是相当无懈可击的,除非你的列表有一些奇怪的非标准顺序,就像通​​过连接以相反顺序排序的两个列表一样。

我建议随机选择。

  

我的算法只有在我使用第一个元素作为数据

时才有效

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