基数排序比快速排序快

 

最近在关于算法的书籍

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

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;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值