桶排序

算法:

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

 

posted @ 2017-06-02 15:42  yl007  阅读(168)  评论(0编辑  收藏  举报