常用排序算法(八)桶排序
概要
本章介绍排序算法中的桶排序。内容包括:
1. 桶排序介绍
2. 桶排序图文说明
3. 桶排序实现
3.1 桶排序C实现
3.2 桶排序C++实现
3.3 桶排序Java实现
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3602737.html
更多排序和算法请参考:数据结构与算法系列 目录
桶排序介绍
桶排序(Bucket Sort)的原理很简单,它是将数组分到有限数量的桶子里。
假设待排序的数组a中共有N个整数,并且已知数组a中数据的范围[0, MAX)。在桶排序时,创建容量为MAX的桶数组r,并将桶数组元素都初始化为0;将容量为MAX的桶数组中的每一个单元都看作一个"桶"。
在排序时,逐个遍历数组a,将数组a的值,作为"桶数组r"的下标。当a中数据被读取时,就将桶的值加1。例如,读取到数组a[3]=5,则将r[5]的值+1。
桶排序图文说明
桶排序代码
/*
* 桶排序
*
* 参数说明:
* a -- 待排序数组
* n -- 数组a的长度
* max -- 数组a中最大值的范围
*/
void bucketSort(int a[], int n, int max)
{
int i,j;
int buckets[max];
// 将buckets中的所有数据都初始化为0。
memset(buckets, 0, max*sizeof(int));
// 1. 计数
for(i = 0; i < n; i++)
buckets[a[i]]++;
// 2. 排序
for (i = 0, j = 0; i < max; i++)
{
while( (buckets[i]--) >0 )
a[j++] = i;
}
}
bucketSort(a, n, max)是作用是对数组a进行桶排序,n是数组a的长度,max是数组中最大元素所属的范围[0,max)。
假设a={8,2,3,4,3,6,6,3,9}, max=10。此时,将数组a的所有数据都放到需要为0-9的桶中。如下图:
在将数据放到桶中之后,再通过一定的算法,将桶中的数据提出出来并转换成有序数组。就得到我们想要的结果了。
桶排序实现
1 /**
2 * 桶排序:C 语言
3 *
4 * @author skywang
5 * @date 2014/03/13
6 */
7
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11
12 // 数组长度
13 #define LENGTH(array) ( (sizeof(array)) / (sizeof(array[0])) )
14
15 /*
16 * 桶排序
17 *
18 * 参数说明:
19 * a -- 待排序数组
20 * n -- 数组a的长度
21 * max -- 数组a中最大值的范围
22 */
23 void bucket_sort(int a[], int n, int max)
24 {
25 int i, j;
26 int *buckets;
27
28 if (a==NULL || n<1 || max<1)
29 return ;
30
31 // 创建一个容量为max的数组buckets,并且将buckets中的所有数据都初始化为0。
32 if ((buckets=(int *)malloc(max*sizeof(int)))==NULL)
33 return ;
34 memset(buckets, 0, max*sizeof(int));
35
36 // 1. 计数
37 for(i = 0; i < n; i++)
38 buckets[a[i]]++;
39
40 // 2. 排序
41 for (i = 0, j = 0; i < max; i++)
42 while( (buckets[i]--) >0 )
43 a[j++] = i;
44
45 free(buckets);
46 }
47
48 void main()
49 {
50 int i;
51 int a[] = {8,2,3,4,3,6,6,3,9};
52 int ilen = LENGTH(a);
53
54 printf("before sort:");
55 for (i=0; i<ilen; i++)
56 printf("%d ", a[i]);
57 printf("\n");
58
59 bucket_sort(a, ilen, 10); // 桶排序
60
61 printf("after sort:");
62 for (i=0; i<ilen; i++)
63 printf("%d ", a[i]);
64 printf("\n");
65 }
1 /**
2 * 桶排序:C++
3 *
4 * @author skywang
5 * @date 2014/03/13
6 */
7
8 #include <iostream>
9 #include <cstring>
10 using namespace std;
11
12 /*
13 * 桶排序
14 *
15 * 参数说明:
16 * a -- 待排序数组
17 * n -- 数组a的长度
18 * max -- 数组a中最大值的范围
19 */
20 void bucketSort(int* a, int n, int max)
21 {
22 int i, j;
23 int *buckets;
24
25 if (a==NULL || n<1 || max<1)
26 return ;
27
28 // 创建一个容量为max的数组buckets,并且将buckets中的所有数据都初始化为0。
29 if ((buckets = new int[max])==NULL)
30 return ;
31 memset(buckets, 0, max*sizeof(int));
32
33 // 1. 计数
34 for(i = 0; i < n; i++)
35 buckets[a[i]]++;
36
37 // 2. 排序
38 for (i = 0, j = 0; i < max; i++)
39 while( (buckets[i]--) >0 )
40 a[j++] = i;
41
42 delete[] buckets;
43 }
44
45
46 int main()
47 {
48 int i;
49 int a[] = {8,2,3,4,3,6,6,3,9};
50 int ilen = (sizeof(a)) / (sizeof(a[0]));
51
52 cout << "before sort:";
53 for (i=0; i<ilen; i++)
54 cout << a[i] << " ";
55 cout << endl;
56
57 bucketSort(a, ilen, 10); // 桶排序
58
59 cout << "after sort:";
60 for (i=0; i<ilen; i++)
61 cout << a[i] << " ";
62 cout << endl;
63
64 return 0;
65 }
桶排序Java实现
实现代码(BucketSort.java)
1 /**
2 * 桶排序:Java
3 *
4 * @author skywang
5 * @date 2014/03/13
6 */
7
8 public class BucketSort {
9
10 /*
11 * 桶排序
12 *
13 * 参数说明:
14 * a -- 待排序数组
15 * max -- 数组a中最大值的范围
16 */
17 public static void bucketSort(int[] a, int max) {
18 int[] buckets;
19
20 if (a==null || max<1)
21 return ;
22
23 // 创建一个容量为max的数组buckets,并且将buckets中的所有数据都初始化为0。
24 buckets = new int[max];
25
26 // 1. 计数
27 for(int i = 0; i < a.length; i++)
28 buckets[a[i]]++;
29
30 // 2. 排序
31 for (int i = 0, j = 0; i < max; i++) {
32 while( (buckets[i]--) >0 ) {
33 a[j++] = i;
34 }
35 }
36
37 buckets = null;
38 }
39
40 public static void main(String[] args) {
41 int i;
42 int a[] = {8,2,3,4,3,6,6,3,9};
43
44 System.out.printf("before sort:");
45 for (i=0; i<a.length; i++)
46 System.out.printf("%d ", a[i]);
47 System.out.printf("\n");
48
49 bucketSort(a, 10); // 桶排序
50
51 System.out.printf("after sort:");
52 for (i=0; i<a.length; i++)
53 System.out.printf("%d ", a[i]);
54 System.out.printf("\n");
55 }
56 }
上面3种实现的原理和输出结果都是一样的。下面是它们的输出结果:
before sort:8 2 3 4 3 6 6 3 9
after sort:2 3 3 3 4 6 6 8 9