【十七】排序算法(三)--快速排序

1、快速排序

这里写图片描述

算法步骤:

  1. 从数列中挑出一个元素,称为 “基准”(pivot)。
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

2、算法实现

/*
快速排序算法:
    通俗的描述法:
        将一个待排序列,取一个基准值,划分成左右2部分,左边的都比基准值小,
        右边的都比基准值大;基准值一般取待排序列的第一个元素,具体操作如下面的算法,
        low-high用来指定这个即将被分割的序列的范围,通常把第一个元素取出来,保存在临时
        变量,当做基准值,这时候可以把low位置看作一个空位置,
        因为它的元素保存在基准变量里了,然后扫描从low到high的所有元素,先从high处开始,
        如果元素比基准值大,则high--,如果小于基准值,则交换high处元素到low处(此时low处
        为空),交换后,保持high不变,high位置变为空,接着换从low处开始扫描,遇到比基准
        值小的,low++,如果大于了基准值,那么又交换low和high处的元素,交换后low位置又处
        于空!如此循环,直到low不在小于high,这样排序后,基准值就排到了一个正确的位置,
        左边的都比基准值小,右边的都比基准值大;然后返回这个位置号,下一次分割就依据这个
        位置号,把序列分割成两部分,依次类推!

*/
int partition(int *array,int low, int high)
{
    int temp = array[low];

    while(low < high)
    {
        while( (low < high) && (array[high] >= temp))
        {
            high--;
        }
        swap(array,low,high);

        while((low < high) &&(array[low] <= temp))
        {
            low++;
        }
        swap(array,low,high);
    }
    return low;
}

/*
递归分割:
    第一次分割时,low=0;,high=len-1;把第0个元素作为基准值,对序列进行排序,排序后
        该基准值,会被移动到正确的位置,low会记录这个位置,并返回这个位置号
    第二次分割:上一次分割后,序列被分成了两部分,第一部分:low=0,high=lastlow - 1;
            第二部分:low=lastlow +1,high=len-1,然后再对它们分别进行取基准值,再分割
    第三次分割:类似于第二次,直到条件不满足,递归退出!
*/
void QSort(int *array, int low,int high)
{
    if(low < high)
    {
        int lastlow = partition(array,low,high);

        QSort(array,low,lastlow - 1);
        QSort(array,lastlow + 1, high);

    }
}

void QuickSort(int *array, int len)
{
    QSort(array,0,len - 1);
}

3、完整源码下载

文件名:quicksort-1.0.tar.gz
链接: http://pan.baidu.com/s/1pJLvi91 密码: ahss

编译步骤:

0.1 解压缩:tar -zxvf quicksort-1.0.tar.gz
0.2 编译:gcc -std=c99 -Wall -g quicksort.c -o quicksort
0.3 运行:./quicksort

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值