快速排序(步骤解析、说明)

/*

   分治法
   选择一个值 作为中间值
   中间值 左边的数 小于它
   中间值 右边的数 大于他
*/
/*
   l low
   h high
*/
void quicksort(int a[],int l,int h)
{
    /*
      结束条件
         当左边的指针等于右边的指针时
         返回
    */
    if(l>=h)
        return ;
    int i=l,j=h;
    int index = a[l];
    while(i<j)
    {
        /*
            在右边
            判断 值 和 index关系
            找到 一个 比index小的值
        */
        while(i<j&&a[j]>=index)
        {
            j--;
        }
         /*
            将右边的值赋值到当前已保存的左边的数组
            左边的指针向右平移
          */
        if(i<j)
        {    
            a[i++]=a[j];
        }
        /*
            在左边
            判断 值 和 index 的关系
            找到 一个 比index 值 大的数
        */
        while(i<j&&a[i]<index)
        {
            i++;
        }
        /*
         将左边的值赋给右面指针指向的值
         右边指针当前指向的值
         为 已知的 比index小的值
         右边的指针向左平移
        */
        if(i<j)
        {
            a[j--]=a[i];

        }
    }
   //将选定的值存放在它有序的位置
    a[i]=index;
    // 安排 该值左边的值
    quicksort(a,l,i-1);
    // 安排该值右边的值
    quicksort(a,i+1,h);

}

这里解释下面三行代码中的 " i<j "

while(i<j)
while(i<j&&a[j]>index)
if(i<j)
这段代码 :
    while(i<j&&a[i]>=index)
    if(i<j)
为什么上面有判断 i<j 还while(i<j&&a[i]>=index)
  这是一个循环,判断j--后与 i 的关系
之后的if(i<j) 
   判断上面的while(i<j&&a[i]>=index)终止的原因
存在一种情况:
  你挑选的值本来的位置就在最左边或者最右边
  这时候不需要交换任何位置
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值