快速排序

来源:互联网 发布:sql%rowcount merge 编辑:程序博客网 时间:2024/05/17 06:37

快速排序(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

原创粉丝点击