快排中的partition函数

//p,r分别是这个要排序的区段的下标
int partion(int *arElem, int p, int r)
{
  int x = arElem[r];
  int i = p,j = p;
  for(; i < r; i++)
  {
    if(arElem[i] < x)
    {
      if(i != j)
      {
        exchange(arElem, i, j);
      }
      j++;
    }
  }
  exchange(arElem, j, r);
  return j;
}

这里主要思想是将这个区间最后一位作为参照数,将比这个数小的数放到左边,比这个数大的数放到右边

i和j分别代表什么:
i是遍历数组用的,指向当前遍历到的数,j总是期望是指向比参照数大的数。

因为只要当前遍历到的数比参照数小,i和j都是同步增长的

当前数如果比参照数大(或等于),那么j就不动了,所以说j期望指向比参照数大的数
在j已经指向比参照数大的数这种情况下,如果当前数比参照数小,那么就会将i和j所指的数交换,并且i和j都向右移动一位。这时候,j肯定是指向比参照数大的数的(自己分析)。

即,如果数组中间有比参照数大的数,j会一直指向比参照数大的数;如果数组中间没有比参照数大的数,j会指向最后的参照数。

所以最后将参照数和j交换就很容易理解了。

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值