快速排序c++(注意事项)

void qsort(int l, int r, int a[])
{
    if (l >= r)    return;
    int i = l - 1, j = r + 1, mid = a[(l + r) / 2];
    while (i < j)
    {
        do { i++; } while (mid > a[i]);
        do { j--; } while (mid < a[j]);
        if (i < j) swap(a[i], a[j]);
    }
    qsort(l, j, a), qsort(j + 1, r, a);
}

1:移动的下标i和j要在数组的两端以外(即left-1和right-1)

2:基准值mid的选用:基准值应该选用值mid=a[(l+r)/2]而不是下标mid=(l+r)/2

尝试使用数组索引mid作为基准值,但在循环中,a[mid]的位置可能会被交换,导致基准值改变。可能会造成算法不正确或效率低下

例如:

void qsort(int l, int r, int a[])
{
    if (l >= r)    return;
    int i = l - 1, j = r + 1, mid = (l + r) / 2;
    while (i < j)
    {
        do { i++; } while (a[mid] > a[i]);
        do { j--; } while (a[mid] < a[j]);
        if (i < j) swap(a[i], a[j]);
    }
    qsort(l, j, a), qsort(j + 1, r, a);
}

这样写就错了

如果基准值mid所在位置的值在排序过程中被交换,就会影响排序的正确性

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值