快速排序算法

        快速排序的基本思想:快速排序又称为分区交换排序,是目前以知的平均速度最快的一种排序方法,采用一种分治的策略,是对冒泡排序的一种改进。其基本思想是:在待排序文件的记录中任取其中一个记录,通常选取第一个记录。以该记录的关键字为分界点(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;
}

排序结果:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值