数据量过大的情况下快速排序也不是好的算法

    技术2022-05-13  3

    本以为以前看过的算法书都说快速排序是最好的排序算法,也没有想过,闲着无聊变写了一个关于基数排序的算法简单分析了一下应该时间复杂度比快速排序小,于是编程实现果然结果要比快速排序快,对两者都

    1000000个数排序快速排序一般要700多毫秒,基数排序一般要200毫秒,

    10000000个数排序的情况就更明显了前者需要30秒左右,而后者只需要3~5秒左右。算法测试如下

    #include<iostream>#include <ctime>#include <cstdlib>#include "time.h"#include "stdlib.h"using namespace std;int * createNumbers(int length );void  display(int *A,int length);void quickSort(int *A,int l,int r);void radixSort(int *A,int length);int main(){    time_t c_start, c_end;      int l=1000000;    int *A=createNumbers(l);    int *B=new int [l];    int *C=new int [l];    for(int i=0;i<l;i++){          B[i]=A[i];          C[i]=A[i];    }     delete A;    //快速排序的时间检测     c_start = clock();                       quickSort(B,0,l-1);      c_end = clock();      cout<<"The quickSort used "<<difftime(c_end,c_start)<<" ms."<<endl;    cout<<endl;    delete B;    //基数排序的时间检测     c_start = clock();                       radixSort(C,l);     c_end = clock();      cout<<"The radixSort used "<<difftime(c_end,c_start)<<" ms."<<endl;    delete C;            system("pause");    return 0;}/**随机的产生length长度的整数数组 */int * createNumbers(int length ){    srand(time(0));     int * A = new int[length];     for(int i=0;i<length;i++){            A[i]=rand();    }    return A;}void  display(int *A,int length){      int i;      for(i=0;i<length;i++){            if(i!=0&&i%5==0){                 cout<<endl;            }            cout<<A[i]<<"     ";                       }                          }

    int partiation(int *A,int l,int r){    int i,j,temp;    j=l;    for(i=l;i<=r;i++){         if(A[i]<A[r]){               temp=A[i];               A[i]=A[j];               A[j]=temp;               j++;                 }                  }    temp=A[j];    A[j]=A[r];    A[r]=temp;    return j;}/**快速排序的算法实现 l表示A中最左端元素的索引r表示B中最右端元素的索引 */void quickSort(int *A,int l,int r){     if(l<r){         int q=partiation(A,l,r);          quickSort(A,l,q-1);         quickSort(A,q+1,r);           }}/**基数排序算法的实现length代表A中元素的个数 */void radixSort(int *A,int length){     int i,j,k;     const int len=255;     int *C=new int[256];     int *B=new int[length];     for(i=0;i<32;i+=8){         for(j=0;j<=len;j++)             C[j]=0;         for(j=0;j<length;j++){             C[(A[j]>>i)&len]++;         }                               for(j=1;j<=len;j++){             C[j]=C[j]+C[j-1];                         }                        for(j=length-1;j>=0;j--){             k=(A[j]>>i)&len;             C[k]--;             B[C[k]]=A[j];               }          for(j=0;j<length;j++){             A[j]=B[j];         }                                       }     delete B;}

     

    本文来自博客,转载请标明出处:http://blog.csdn.net/lfq08063440/archive/2009/07/13/4345794.aspx


    最新回复(0)