快速排序(分治算法)

步骤
1.每次将序列中的第一个元素作为一个一个基准,
2.在序列的左边找到第一个比基准元素大的值,在序列的右面找到第一个比序列小的值,交换这两个值,使得在这两个值的两边元素分别小于、大于基准元素。继续在序列中寻找,之后再交换,最终实现在某个位置,该元素的值(包括该元素)都比基准元素小,该元素的右面的元素值都比基准元素大。将这个值和基准元素进行交换,实现在基准元素的左边,元素值都比基准元素小,基准元素的右面都比基准元素大。
3.将序列分为三部分:基准元素的左边、基准元素、基准元素的右边。
进行分治。最终实现排序
算法实现:

void quickSort(int data[], int low, int high){
    //判断当前序列中是否有元素
    if (low < high){
        //将序列的两端都戳上指针
        int left = low;
        int right = high-1;
        //将序列的第一个元素作为基准值
        //通过循环实现在某个位置,该位置的左面(包括该位置)都小于基准值,改位置的右面都大于基准值
        while (left < right){
            //通过循环找到序列左面第一个比基准值大的位置
            for (; left < high&&data[left] <= data[low];left++);
            //通过循环找到序列的右面第一个比基准值小的元素
            for (; right > low&&data[right]>data[low];right--);
            if (left < right){
                //说明在当前序列中left和right都找到了符合条件的位置
                //交换data[left]和data[right]的值实现在left的左面元素值都比基准值小,right的右面都比基准值大
                int temp = data[left];
                data[left]=data[right];
                data[right] = temp;
            }
        }
        //通过交换data[low]和datap[right]的值实现在基准值的左面元素都比基准值小,基准值的右面元素都比基准值大
        int temp = data[low];
        data[low] = data[right];
        data[right] = temp;

        //左递归调用
        quickSort(data, low, right);
        //右递归调用
        quickSort(data, right + 1, high);
    }
}

调试:

int main(void){
    int data[8] = { 3, 2, 5, 8, 4, 7, 6, 9 };
    quickSort(data, 0, 8);
    for (int i = 0; i < 8; i++){
        printf("%d ",data[i]);
    }
    return 0;
}

调试结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值