桶排序
算法:
1、设置一个定量的数组当作空桶子。
2、寻访串行,并且把项目一个一个放到对应的桶子去。
3、对每个不是空的桶子进行排序。
4、从不是空的桶子里把项目再放回原来的串行中。
include <time.h> 02.#include <iostream> 03.#include <iomanip> 04.using namespace std; 05. 06./*initial arr*/ 07.void InitialArr(double *arr,int n) 08.{ 09.srand((unsigned)time(NULL)); 10.for (int i = 0; i<n;i++) 11.{ 12.arr[i] = rand()/double(RAND_MAX+1); //(0.1) 13.} 14.} 15. 16./* print arr*/ 17.void PrintArr(double *arr,int n) 18.{ 19.for (int i = 0;i < n; i++) 20.{ 21.cout<<setw(15)<<arr[i]; 22.if ((i+1)%5 == 0 || i == n-1) 23.{ 24.cout<<endl; 25.} 26.} 27.} 28. 29.void BucketSort(double * arr,int n) 30.{ 31.double **bucket = new double*[10]; 32.for (int i = 0;i<10;i++) 33.{ 34.bucket[i] = new double[n]; 35.} 36.int count[10] = {0}; 37.for (int i = 0 ; i < n ; i++) 38.{ 39.double temp = arr[i]; 40.int flag = (int)(arr[i]*10); //flag标识小树的第一位 41.bucket[flag][count[flag]] = temp; //用二维数组的每个向量来存放小树第一位相同的数据 42.int j = count[flag]++; 43. 44./* 利用插入排序对每一行进行排序 */ 45.for(;j > 0 && temp < bucket[flag][j - 1]; --j) 46.{ 47.bucket[flag][j] = bucket[flag][j-1]; 48.} 49.bucket[flag][j] =temp; 50.} 51. 52./* 所有数据重新链接 */ 53.int k=0; 54.for (int i = 0 ; i < 10 ; i++) 55.{ 56.for (int j = 0 ; j< count[i];j++) 57.{ 58.arr[k] = bucket[i][j]; 59.k++; 60.} 61.} 62.for (int i = 0 ; i<10 ;i++) 63.{ 64.delete bucket[i]; 65.bucket[i] =NULL; 66.} 67.delete []bucket; 68.bucket = NULL; 69.} 70. 71.void main() 72.{ 73.double *arr=new double[10]; 74.InitialArr(arr, 10); 75.BucketSort(arr, 10); 76.PrintArr(arr,10); 77.delete [] arr; 78.}