[C] [二分] C语言实现快速排序

为了以防万一有人想不开想手撕快排呢?比如我。

通过快排来理解二分思想

什么是快排?

快排的思想不难,理解好递归很重要。

什么是递归?

递归,就是在运行的过程中调用自己。
构成递归需具备的条件:

  1. 子问题须与原始问题为同样的事,且更为简单;
  2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
什么是二分?

“一尺之捶,日取其半,万世不竭” 相信你不陌生吧?这是来自《庄子·天下》中惠施的一句名言。说的就是二分(有的时候不得不感慨古人的智慧啊!)
将一项大任务,不断自截两半,调用相同的处理函数分别处理,截到什么时候呢?截到可以解决这个问题为止。

快排的思想

很多时候我们使用二分法,并不知道它的最小单位是多少,为什么会对这个最小的没有感觉呢?
因为我们需要关注的不过三个点,首,尾,和我们要取到的中点。假设这个中点为i,下次递归就是lefti-1i+1right
搞清楚这三个点之后,具体分到多小了,就不是那么重要了。
接下来我们要关注的就是“退出” 的时机。在快排里,当首尾指针相遇,就是我们该停止的时候。在代码里体现是:

if (l > r)
{
   return;
}

其中l是左指针,r是右指针。


C语言实现快排

#include<stdio.h>

int a[100], n;

void quicksort(int l, int r)
{
    int i, j, t, temp;
    if (l > r)
    {
        return;
    }
    temp = a[l];//基准数
    i = l;
    j = r;
    while (i != j)
    {
        while (a[j] >= temp && i < j)
        {
            j--;
        }
        while (a[i] <= temp && i < j)
        {
            i++;
        }
        if (i < j)
        {
            t = a[i];
            a[i] = a[j];
            a[j] = t;
        }

    }
    a[l] = a[i];
    a[i] = temp;
    quicksort(l, i - 1);
    quicksort(i + 1, r);
}

int main()
{
    int i, j, t;
    scanf("%d", &n);
    for (i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
    }
    quicksort(1, n);
    for (i = 1; i <= n; i++)
    {
        printf("%d ", a[i]);
    }
    return 0;
}

/*
11
6 2 1 7 9 3 4 5 10 8 5
*/

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值