排序算法——桶排序
2014-06-12 09:12
190 查看
排序算法——桶排序
算法存储工作
桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将阵列分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的阵列内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是比较排序,他不受到
O(n log n) 下限的影响。
例如要对大小为[1..1000]范围内的n个整数A[1..n]排序,可以把桶设为大小为10的范围,具体而言,设集合B[1]存储[1..10]的整数,集合B[2]存储(10..20]的整数,……集合B[i]存储((i-1)*10,
i*10]的整数,i = 1,2,..100。总共有100个桶。然后对A[1..n]从头到尾扫描一遍,把每个A[i]放入对应的桶B[j]中。然后再对这100个桶中每个桶里的数字排序,这时可用冒泡,选择,乃至快排,一般来说任何排序法都可以。最后依次输出每个桶里面的数字,且每个桶中的数字从小到大输出,这样就得到所有数字排好序的一个序列了。
假设有n个数字,有m个桶,如果数字是平均分布的,则每个桶里面平均有n/m个数字。如果对每个桶中的数字采用快速排序,那么整个算法的复杂度是O(n+m*n/m*log(n/m))=O(n+nlogn-nlogm)
从上式看出,当m接近n的时候,桶排序复杂度接近O(n)
当然,以上复杂度的计算是基于输入的n个数字是平均分布这个假设的。这个假设是很强的,实际应用中效果并没有这么好。如果所有的数字都落在同一个桶中,那就退化成一般的排序了。
Code:
1. #include <stdio.h>
2. #include <stdlib.h>
3. #include <string.h>
4.
5. extern void quick_sort(int a[], int p, int q);/* not necessary */
6.
7. struct barrel {
8. int node[10];
9. int count;/* the num of node */
10. };
11.
12. void bucket_sort(int data[], int size)
13. {
14. int max, min, num, pos;
15. int i, j, k;
16. struct barrel *pBarrel;
17.
18. max = min = data[0];
19. for (i = 1; i < size; i++) {
20. if (data[i] > max) {
21. max = data[i];
22. } else if (data[i] < min) {
23. min = data[i];
24. }
25. }
26. num = (max - min + 1) / 10 + 1;
27. pBarrel = (struct barrel*)malloc(sizeof(struct barrel) * num);
28. memset(pBarrel, 0, sizeof(struct barrel) * num);
29.
30. /* put data[i] into barrel which it belong to */
31. for (i = 0; i < size; i++) {
32. k = (data[i] - min + 1) / 10;/* calculate the index of data[i] in barrel */
33. (pBarrel + k)->node[(pBarrel + k)->count] = data[i];
34. (pBarrel + k)->count++;
35. }
36.
37. pos = 0;
38. for (i = 0; i < num; i++) {
39. quick_sort((pBarrel+i)->node, 0, (pBarrel+i)->count);/* sort node in every barrel */
40.
41. for (j = 0; j < (pBarrel+i)->count; j++) {
42. data[pos++] = (pBarrel+i)->node[j];
43. }
44. }
45. free(pBarrel);
46. }
47.
48. main()
49. {
50. int data[] = {78, 17, 39, 26, 72, 94, 21, 12, 23, 91}, i;
51. int size = sizeof(data) / sizeof(int);
52. bucket_sort(data, size);
53.
54. for (i = 0; i < size; i++)
55. printf("%d ", data[i]);
56. }
算法存储工作
桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将阵列分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的阵列内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是比较排序,他不受到
O(n log n) 下限的影响。
例如要对大小为[1..1000]范围内的n个整数A[1..n]排序,可以把桶设为大小为10的范围,具体而言,设集合B[1]存储[1..10]的整数,集合B[2]存储(10..20]的整数,……集合B[i]存储((i-1)*10,
i*10]的整数,i = 1,2,..100。总共有100个桶。然后对A[1..n]从头到尾扫描一遍,把每个A[i]放入对应的桶B[j]中。然后再对这100个桶中每个桶里的数字排序,这时可用冒泡,选择,乃至快排,一般来说任何排序法都可以。最后依次输出每个桶里面的数字,且每个桶中的数字从小到大输出,这样就得到所有数字排好序的一个序列了。
假设有n个数字,有m个桶,如果数字是平均分布的,则每个桶里面平均有n/m个数字。如果对每个桶中的数字采用快速排序,那么整个算法的复杂度是O(n+m*n/m*log(n/m))=O(n+nlogn-nlogm)
从上式看出,当m接近n的时候,桶排序复杂度接近O(n)
当然,以上复杂度的计算是基于输入的n个数字是平均分布这个假设的。这个假设是很强的,实际应用中效果并没有这么好。如果所有的数字都落在同一个桶中,那就退化成一般的排序了。
Code:
1. #include <stdio.h>
2. #include <stdlib.h>
3. #include <string.h>
4.
5. extern void quick_sort(int a[], int p, int q);/* not necessary */
6.
7. struct barrel {
8. int node[10];
9. int count;/* the num of node */
10. };
11.
12. void bucket_sort(int data[], int size)
13. {
14. int max, min, num, pos;
15. int i, j, k;
16. struct barrel *pBarrel;
17.
18. max = min = data[0];
19. for (i = 1; i < size; i++) {
20. if (data[i] > max) {
21. max = data[i];
22. } else if (data[i] < min) {
23. min = data[i];
24. }
25. }
26. num = (max - min + 1) / 10 + 1;
27. pBarrel = (struct barrel*)malloc(sizeof(struct barrel) * num);
28. memset(pBarrel, 0, sizeof(struct barrel) * num);
29.
30. /* put data[i] into barrel which it belong to */
31. for (i = 0; i < size; i++) {
32. k = (data[i] - min + 1) / 10;/* calculate the index of data[i] in barrel */
33. (pBarrel + k)->node[(pBarrel + k)->count] = data[i];
34. (pBarrel + k)->count++;
35. }
36.
37. pos = 0;
38. for (i = 0; i < num; i++) {
39. quick_sort((pBarrel+i)->node, 0, (pBarrel+i)->count);/* sort node in every barrel */
40.
41. for (j = 0; j < (pBarrel+i)->count; j++) {
42. data[pos++] = (pBarrel+i)->node[j];
43. }
44. }
45. free(pBarrel);
46. }
47.
48. main()
49. {
50. int data[] = {78, 17, 39, 26, 72, 94, 21, 12, 23, 91}, i;
51. int size = sizeof(data) / sizeof(int);
52. bucket_sort(data, size);
53.
54. for (i = 0; i < size; i++)
55. printf("%d ", data[i]);
56. }
相关文章推荐
- 排序算法_0,桶排序
- 漫谈经典排序算法:五、线性时间排序(计数、基数、桶排序)
- 排序算法-桶排序
- ~排序算法——桶排序~
- 常见排序算法导读(11)[桶排序]
- 排序算法-桶排序
- 排序算法_桶排序
- 排序算法汇总--冒泡,插入,归并,快速,堆,计数,基数,桶排序
- 排序算法(插入排序、shell排序、冒泡排序、选择排序、合并排序、堆排序、快速排序、计数排序、基数排序、桶排序)
- Java排序算法(十)--桶排序
- 数字的排序算法—计数排序、桶排序和基数排序
- 排序算法(计数排序,基数排序,桶排序)
- [排序算法]--桶排序的Java实现
- 常见排序算法——桶排序(箱子排序)bucket Sort
- 漫谈经典排序算法:五、线性时间排序(计数、基数、桶排序)
- 程序猿找工作必练内功:排序算法大总结(五)——线性时间排序算法(计数排序,基数排序,桶排序)
- 三种线性的非基于比较的排序算法:计数排序、桶排序与基数排序
- python语言小程序——排序算法2(桶排序-三种方案)
- 排序算法——桶排序、冒泡排序、快速排序、选择排序
- 排序算法---最快最简单的桶排序