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