桶排序
假设有n个数组成一个数组a[n],a[n]的范围是0~m,现在需要对这个数组进行排序。
桶排序的过程:我们准备一个数组b[m],初始化该数组为0。观察a[i]的值(0<=i<=n),比如说a[i]=x(显然0<x<m),则b[x]++,即利用b[x]存储a[n]中值为x的元素出现了几次。最后,我们按照0~m的顺序,依次输出b[x]次x,得到的序列就是排序结果。
废话不多说,直接上代码:
1 #include<iostream> 2 3 using namespace std; 4 5 //假设桶排序所排序的n个数分布在min~max之间 6 void booksort(int* a,int n,int min,int max) 7 { 8 int* book=new int[max-min+1]; 9 memset(book,0,sizeof(int)*(max-min+1)); 10 11 for(int i=0;i<n;i++) 12 { 13 book[a[i]-min]++; 14 } 15 16 for(int i=0;i<(max-min+1);i++) 17 { 18 for(int j=0;j<book[i];j++) 19 { 20 cout<<i+min<<" "; 21 } 22 } 23 } 24 25 26 27 int main() 28 { 29 int str[10]={8,4,5,7,55,8,42,3,5,8}; 30 31 booksort(str,10,3,55); 32 33 cout<<endl; 34 35 return 0; 36 }
桶排序是一种不稳定排序,其时间复杂度为O(N)+O(M*(N/M)*log(N/M))=O(N+N*(logN-logM))=O(N+N*logN-N*logM)。