我正在尝试使用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);
}
}
答案 0 :(得分:1)
您的枢轴选择的约束是它需要相当快。常见的方法是选择第一个元素,选择中间元素或选择随机元素。
使用随机元素可能是最好的,因为即使对于已经排序的列表,它仍然会有快速排序(使用第一个元素在排序列表上表现很差,因为以下所有元素都会落在一边枢轴)。
使用中间元素也是相当无懈可击的,除非你的列表有一些奇怪的非标准顺序,就像通过连接以相反顺序排序的两个列表一样。
我建议随机选择。
我的算法只有在我使用第一个元素作为数据
时才有效
当你这样说时,如果你的支点不是第一个元素,你的意思是它会产生一个错误排序的列表吗?你能详细介绍一下吗?