快速排序算法

在前面博客有写英文版的快速查找实现例子,在复习的时候,有了新的领悟。


【思想】

快速排序算法关键在于先在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的移动到数组左边,比选择的数字大的移动到数组的右边。


【实例说明】

快速排序数组data[] = {2,4,9,3,6,7,1,5},设置第一个数为基准值,将其他元素与其进行比较,数组长度为8,设置两个指针i,j分别指向待排序数组首末下标,待比较情况进行移动:
第一组排序:
以基准值basis = data[0] = 2对数组进行划分调整顺序,让小于2的都在它的左边,大于2的都在它的右边,具体实现思想为,先对data[j]进行操作,当data[j]> basis, j减1,向前移动一个,否则将data[j]的值填补data[i],data[j]就变成下次待填补对象,i此时向后移动一格,并开始对data[i]进行操作,如果data[i]< basis,i加1,向后移动一格,否则就将data[i]的值填补此时的data[j],data[i]此时变成待填补对象,j向前移动,重复前面的步骤,直到i = j时,说明全部比较完了,填补此时data[i]的位置,如此便能得到以基准值划分出来的左边小于basis,右边大于basis的情况。过程如下图所示:
这里写图片描述
这一组排序以basis = data[i],i = 0,j = 7,排序后得到的数组{1,2,9,3,6,7,4,5}
第二组排序:i = 0 , j = 0, basis = data[i] =1,排序后得到的数组{1,2,9,3,6,7,4,5}
第三组排序:i = 2, j=7, basis = data[i] = 9,排序后得到的数组{1,2,5,3,6,7,4,9}
这里写图片描述
第四组排序:i=2,j=6,basis = data [2] = 5,排序后得到的数组{1,2,4,3,5,7,6,9}
这里写图片描述
第五组排序:i = 2,j = 3,,basis = data[2] = 4,排序后得到的数组{1,2,3,4,5,7,6,9}
这里写图片描述
第五组排序:i = 5,j = 6,basis = data[5] = 7,排序后得到的数组{1,2,3,4,5,6,7,9}
这里写图片描述


【测试代码】

#include<stdio.h>

void quicksort(int data[],int lo,int hi)
{
    if(lo>=hi)
        return;

    int i=lo , j=hi;
    int basis = data[lo];
    while(i < j)
    {
        while((data[j] > basis)&&(i<j))
            j-- ;
        if(i<j)//这块一定要有这个判断,否则会出错
        {       
            data[i++] = data[j];
        }

        while((data[i] < basis)&&(i<j))
            i++;
        if(i<j)
        {   
            data[j--] = data[i];        
        }
    }
    data[ i ] = basis;
    quicksort(data, lo, i-1 );
    quicksort(data, i+1, hi);
}

int main()
{
    int i;
    int data[] = {2,4,9,3,6,7,1,5};

    quicksort(data , 0 , 7);

    for(i=0;i<8;i++)
        printf("%d ",data[i]);

    return 0;
}

【输出】
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值