c - 如何使枢轴元素在快速排序中通用?

标签 c sorting pivot quicksort

我正在尝试使用快速排序对文件中存在的 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);
    }
}

最佳答案

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

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

使用中间元素也相当安全,除非您的列表采用某种奇怪的非标准顺序,例如通过连接两个按相反顺序排序的列表会发现。

我建议随机选择。

My algorithm works only if I use first element as pivot

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

关于c - 如何使枢轴元素在快速排序中通用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12325959/

相关文章:

c - 引用外部全局变量惨遭失败

c - 使用链表合并两个排序列表

javascript - 如何测试数组列中的单元格中的数字或字符串

javascript - 按属性对数组中的对象进行分组

sql - 编写高级 SQL 选择

c - Windows 等效的 POSIX srandom(...) 和 random() 函数?

c - 将 char 数组的元素传递到另一个位置

python - sorted() 函数不同于通过列表理解获得的结果

python - Python 中的堆栈和数据透视数据框

python - python pandas中融化的对面