【C语言】快速排序模板

模板

用两个指针i、j,确定好x,再令小于x的放在x左边,大于x的放在x的右边,通过do..while来实现,让l指针向后移动,直到遇见大于x的值,让r指针向前移动,直到遇见小于x的值(因为边界问题,i要等于l-1,j要等于r+1)此时,交换i、j指向的元素,从而实现把小于x的放在x左边,大于x的放在x的右边,又因为这一行为需要重复做,所以放在while里面,循环条件是i<j。

后面使用递归来分别排序x的左边、x的右边。

#include<stdio.h>

void quick_sort(int* arr, int l, int r)
{
    if (l >= r)
    {
        return;
    }
    else
    {
        int i = l - 1;
        int j = r + 1;
        int x = arr[(l + r) / 2];
        while (i < j)
        {
            do
            {
                i++;
            } while (arr[i] < x);

            do
            {
                j--;
            } while (arr[j] > x);

            if (i < j)
            {
                int tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
        quick_sort(arr, l, j);
        quick_sort(arr, j + 1, r);
    }
}
int main()
{
    int n = 0;
    int arr[100000] = { 0 };
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }

    quick_sort(arr, 0, n - 1);

    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值