快速排序算法

来源:互联网 发布:手机淘宝1元抢购在哪 编辑:程序博客网 时间:2024/06/05 08:37

        快速排序的基本思想:快速排序又称为分区交换排序,是目前以知的平均速度最快的一种排序方法,采用一种分治的策略,是对冒泡排序的一种改进。其基本思想是:在待排序文件的记录中任取其中一个记录,通常选取第一个记录。以该记录的关键字为分界点(pivot),经过一趟排序后,将全部记录分为两部分:所有比分界点小的记录都存放在分界点之前,所有比分界点大的记录都排在分界点之后,然后再分别对这两个部分重复上述过程,直到每一部分只剩下一个记录为止。显然,每趟快速排序后,分界点都找到了自己在有序序列中的适当位置。

 

一次快速排序(一次划分)的实现过程如下:

        设置两个指针,low和high,分别指向待排序列两端,并将序列中的第一个记录暂存起来作为分界点(pivot)。首先,用high指针所指记录的关键字与pivot进行比较,若该关键字比pivot大(或相等),则high指针集训向前搜索;若该关键字比pivot小,则将high指向的记录存入low指针所指的位置,此时high指针停止搜索,转由low指针开始向后搜索。

        low向后移动,将low指针所指记录的关键字与pivot进行比较,若该关键字比pivot小,则low指针继续向后搜索;若该关键字比pivot大(或相等),则将low指向的记录存入high指针所指向的位置上,此时low指针停止搜索,high指针重新开始被暂停的向前搜索,......。整个划分过程就是在high指针和low指针不断交替地进行序列的向前和向后搜索中进行的,知道low指针和high指针相遇为止,这时他们相遇的位置就是pivot对应记录在有序序列终的位置,将pivot写入该位置,从而完成一次划分。

 

快速排序算法递归实现代码:

#include <iostream>using namespace std;int Partition(int *a,int low,int high) //进行划分{    int pivot;    pivot = a[low];    while(low < high)    {        while(low < high && a[high] >= pivot)            high--;        if(low < high)        {            a[low]=a[high];            low++;        }        while(low < high && a[low] <= pivot)            low++;        if(low < high)        {            a[high]=a[low];            high--;        }    }    a[low]=pivot;    return low;}void QuickSort(int *a ,int low,int high){    int id;    if(low < high)    {        id = Partition(a,low,high);        QuickSort(a,low,id-1);        QuickSort(a,id+1,high);    }}int main(){    int a[10] = {3,2,1,5,6,7,2,10,8,9};    int low = 0;    int high = 9;    cout << "排序之前:";    for(int i=0;i<10;i++)        cout << a[i] << " ";    cout << endl;    QuickSort(a,low,high);    cout << "排序之后:";    for(int i=0;i<10;i++)        cout << a[i] << " ";    cout << endl;    return 0;}

排序结果:

 

 

原创粉丝点击