快速排序算法

前言:quicksort是冒泡法的改进版,由于quicksort的排序效率在同为0(N*logN)的几种排序方法中效率最高,当面对大量的数据时,使用quicksort能比冒泡法大大节省时间。

            quicksort采用了一种分治的策略,通常称为分治法(Divide-and-   ConquerMethod),

           

基本思想:1.先从数列中取出一个数作为基准数(一般选择第一个数)。

                    2.分区过程:将比这个基准数大的数放在他的右边,小于或者等于基准书的数则放在它的左边,

                    3.再对左右区间重复第二步的动作,直到各个区间只有一个数。


特殊情形分析:

定义数据 a[8], low = 0; hight = 7; key = a[low];

情况一:基准数之后的数据都比它大,如:10,12,15,13,14,16,11,17.则无需排序。

                while(low < hight && a[hight] > key)

                       hight--;

情况一:基准数之后的数据都比它小,如:20,12,15,13,14,16,11,17.

第一次,20,12,15,13,14,16,11,17.  将最后一个数据位填到第一位,

               a[ low] = a[hight];

                while(low < hight && a[low] > key)

                       hight--;


实现代码如下:

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

void quick_sort(int s[], int l, int r)
{
    if (l < r)
    {
        int i = l, j = r, x = s[l];
        while (i < j)
        {
            while(i < j && s[j] >= x) // 从右向左找第一个小于x的数
                   j--;
            if(i < j)
                   s[i++] = s[j];
            while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数
                   i++;
            if(i < j)
                   s[j--] = s[i];
        }
        s[i] = x;
        quick_sort(s, l, i - 1); // 递归调用
        quick_sort(s, i + 1, r);
    }
}

int
main()
{
        int a[] = {3,7,1,5,9,2,6,4,8,0};

        char i;
        quick_sort(a,0,9);
        for( i = 0; i <= 9;i++){
            printf("%d\t",a[i]);
        }
        printf("\n");
        return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值