快排方法代码记录

#include <stdio.h>
#include <stdlib.h>


int nums[5];
int main()
{
    int i,j;
    for(i=0;i<5;i++){
        scanf("%d",&nums[i]);
    }
    sort(0,4);
    printf("\n");
    for(i=0;i<5;i++){
        printf("%d ",nums[i]);
    }
    return 0;
}


void sort(int low,int hight){
    if(low >= hight)
        return;
    int target = nums[low];
    //保存好头尾初始位置,下一次递归要用到
    int i = low,j = hight;
    while(low < hight){
        //开始从右边找比基准值小的数
        while(target < nums[hight]){
            hight --;
        }
        //找到后将低位的大数变成高位的小数
        //这里一定要判断,不然low会多加一次
        if(low < hight)
        nums[low++] = nums[hight];
        //然后再从左边找比基准值大的
        while(target > nums[low]) {
            low ++;
        }
        if(low < hight)
        nums[hight--] = nums[low];
    }
    //最后再进行基准值的低位交换
    nums[low] = target;
    //以low为分界线,左右两边的数继续排序
    sort(i,low-1);
    sort(low+1,j);

}

(低位高位指左右两边的游标)
方法总结:头为基准,高位从右找小数,找到将左低位数变为找到的高位小数,再从低位左边找大数,找到将右边高位数变为找到的低位大数,当两游标相遇时将低位数变为基准数,结束一次比较,再以低位数为中心分为左右两边,继续使用递归排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值