快速排序的实现

算法思想:
通过一次排序将待排序对象分割成独立的两部分, 其中一部分对象的关键码均比另一部分对象的关键码小, 再分别对这两部分子序列对象继续进行排序,以达到整个序列有序。

排序过程描述
假设有 n 个待排序的对象{a[0],a[1],…,a[n-1]}
首先任选一个对象 a0作为支点(pivot); 然后调整序列中各个对象的位置;
将所有关键码小于或等于 a[0]的对象排在 a[0]的前面;
将所有关键码大于 a[0]的对象排在 a[0]的后面,即{≤a[0]}:a[0]:{>a[0]}; 以上过程称作一次快速排序。

因为支点已经被变量k保留,所以即使在改变数组中数值的时候,只需要让一个数等于另一个数,并不需要同时改变两个数,只需要在最后让其等于支点即可。

#include <stdio.h>

void quick_sort(int s[], int l, int r)
{
    int i, j, k;
    if (l < r){
        i = j;
        j = r;
        k = s[i];

        while (i < j){
            while (i < j && s[j] > k)  //从左到右找出第一个小于k的数
                j--;
            if (i < j)
                s[i++] = s[j];         //让s[i]等于从左到右第一个小于k的数,并i++

            while (i < j && s[i] < k)  //从右到左找出第一个大于k的数
                i++;
            if (i < j)
                s[j--] = s[i];         //让s[j]等于从右到左第一个大于k的数,并j++
        }
        s[i] = k;
        quick_sort(s, l, i - 1);
        quick_sort(s, i + 1, r);
    }
}

int main(void)
{

    int a[]={49,38,65,97,76,13,27};
    int l = 0;
    int r = 6;
    quick_sort(a,l,r);

    for(int i=0;i<=r;i++)
        printf("%d ",a[i]);
    puts("");
    return 0;  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值