基數排序比快速排序快
最近在關於演算法的書籍
本以為以前看過的演算法書都說快速排序是最好的排序演算法,也沒有想過,閒著無聊變寫了一個關於基數排序的演算法簡單分析了一下應該時間複雜度比快速排序 小,於是程式設計實現果然結果要比快速排序 快,對兩者都
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;
}