普通快速排序与随机快速排序

快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
(https://img-blog.csdn.net/20160608122859542)
普通快速排序

void quickSort(int A[], int p, int r)
{
    if (p< r)
    {
        int i = p, j = r, x = A[p];
        while (i < j)
        {
            while(i < j && A[j]>= x)
                j--;
            if(i < j)
                A[i++] = A[j];
            while(i < j && A[i]< x)
                i++;
            if(i < j)
                A[j--] = A[i];
        }
        A[i] = x;
        quickSort(A, p, i - 1);
        quickSort(A, i + 1, r);
    }
}

随机快排
主元元素是随机选择的,我们可以期望在平均情况下对输入数组的划分是比较均衡的。
通过头文件stdlib.h中的rand()方法生成[p, r]之间的随机数作为主元。rand() % n 将生成 [0, n)之间的随机数。
为了重用quickSort方法,将选定的主元交换到位置 p。
随机化快速排序的好处:
其运行时间不依赖与输入序列的顺序
无需对输入序列的分布做任何假设
没有 一种特别的输入会引起最差的运行情况
最差的情况由随机数产生器决定

    void randomizedquickSort(int A[],int p,int r)
    {
        int i=rand()%(r-p+1)+p;
        int x=A[p];
        A[p]=A[i];
        A[i]=x;
        quickSort(A,p,r);
    }

测试代码

#include<iostream>
    #include<time.h>
    #include<stdlib.h>
    using namespace std;  
    void quickSort(int a[],int,int);
    void randomizedquickSort(int a[],int,int);
    int main()  
    {  
        clock_t start,finish;
        double totaltime;
        int array[100]={0};
        for(int i=0;i<100;i++)
        {
            array[i]=rand()%100;
        }
        start=clock();
        int k;  
        int len=sizeof(array)/sizeof(int);  
        cout<<"原始数组序列为:"<<endl;  
        for(k=0;k<len;k++)  
            cout<<array[k]<<",";  
        cout<<endl;  
        quickSort(array,0,len-1);  
        //randomizedquickSort(array,0,len-1);
        cout<<"排序后的数组序列为:"<<endl;  
        for(k=0;k<len;k++)  
            cout<<array[k]<<",";  
        cout<<endl;
        finish=clock();
        totaltime=(double)(finish-start);
        cout<<"总共花费时间:"<<totaltime<<"毫秒"<<endl;
        system("pause");
        return 0;  
    }  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值