快速排序

快速排序(Quick Sort):快速排序是对冒泡排序的一种改进。它的基本思想是通过一趟排序,将排序记录分割中两个部分,其中一部分记录的关键字比另一部分关键字都要小,再分别对两部分记录进行排序,已达到整个序列有序的目的。快排中用到了递归的思想,在分割出两部分以后对每一部分在进行快排,直到分割到每一部分只有一个记录为止。

示例:有记录 49 38 65 97 76 13 27,我们选择第一个记录作为划分的标准

第一趟:27  38 13 49 97 76  67    //选择的划分标准是49

第二趟:13  27 38 49 76  67 97  //对划分后的27 38 13和97 76 67两部分分别进行排序,再一次选择的划分标准分别是 27 和97

第三趟:13  27 38 49 67  76 97   //因为13 38所在组只有一个数,不必继续排序,而97后面没有数了,也不必继续排序,只有76 67需要继续排序,选择的划分标准76

一个示意图:


快速排序的时间复杂度为O(nlogn),快排被认为是目前最好的一种内部排序算法

C++代码:

//gavin 快速排序 2012-3-24
int Partition ( int * arr , int low , int high )  //划分函数,划分标准为选择第一个记录
{
    arr [ 0= arr [low ];                             //数组的第一个位置用来存记录的划分标准
     int pivotkey  = arr [low ];                   // 划分标准   
     while  (low  < high )
     {
         while (low  < high  && arr [high ]  >= pivotkey )    
            high --;
        arr [low ]  = arr [high ];     //从high端往前找到第一个比划分标准小的放在arr[low]的位置
         while (low  < high  && arr [low ]  <= pivotkey ) 
            low ++;
        arr [high ]  = arr [low ];     //从low端往后找到第一个比划分标准大的放在arr[high]的位置
     }
    arr [low ]  = arr [ 0] ;
     return low ;         //返回划分标准的位置
}

void myQuickSort ( int  *arr ,  int low  ,  int  high )
{
     if  (low  < high )
     {
         int pivotloc  = Partition (arr ,low ,high );     //整个记录划分为两部分
        myQuickSort (arr , low , pivotloc  -  1) ;         //比划分标准小的部分继续递归排序
        myQuickSort (arr , pivotloc  +  1,high );     //比划分标准大的部分也继续递归排序
     }
}

 由于快排的效率比较高,C++的库中已经将这个算法实现了,关于调用C++库中的快排函数,可参考:

http://blog.csdn.net/gavin710/article/details/7391534

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值