1 桶排序核心思想是 根据数据规模n划分 m个相同大小的区间 (每个区间为一个桶,桶可理解为容器)

2 每个桶存储区间内的元素(区间为半开区间 例如[0,10) 或者 [200,300) )

3 将n个元素按照规定范围分布到各个桶中去

4 对每个桶中的元素进行排序,排序方法可根据需要,选择快速排序,或者归并排序,或者插入排序

5 依次从每个桶中取出元素,按顺序放入到最初的输出序列中(相当于把所有的桶中的元素合并到一起)

6 桶可以通过数据结构链表实现

7 基于一个前提,待排序的n个元素大小介于0~k 之间的整数  或者是(0, 1)的浮点数也可(算法导论8.4的例子)

8 桶排序的时间代价,假设有m个桶,则每个桶的元素为n/m

 当辅助函数为冒泡排序O(n2)  ,桶排序为 O(n)+mO((n/m)2)

当辅助函数为快速排序时O(nlgn),  桶排序为 O(n)+mO(n/m log(n/m))

9 通常桶越多,执行效率越快,即省时间,但是桶越多,空间消耗就越大,是一种通过空间换时间的方式

注意:代码前部分为辅助代码

辅助类:链表Link

辅助函数:冒泡排序BubbleSort

  1. #include <iostream>
  2. #include <crtdbg.h>
  3. #include <cstring>
  4. using namespace std;
  5.  
  6. typedef int DataType;
  7. //建立链表
  8. class Link
  9. {
  10. private:
  11. struct Node
  12. {
  13. DataType data;
  14. Node *next;
  15. };
  16. Node *head; //哨兵位
  17. public:
  18. Link()
  19. {
  20. Init();
  21. }
  22. ~Link()
  23. {
  24. Delete();
  25. }
  26. void Init()
  27. {
  28. head = new Node;
  29. head->next = NULL;
  30. }
  31. void Delete()
  32. {
  33. for (Node *p = head; p != NULL;)
  34. {
  35. Node *pTemp = p->next;
  36. delete p;
  37. p = pTemp;
  38. }
  39. head = NULL;
  40. }
  41. void Print()
  42. {
  43. for (Node *p = head->next; p != NULL; p = p->next)
  44. {
  45. cout << p->data << endl;
  46. }
  47. }
  48. //顺序插入 考虑两种情况 1.空表 2.当插入值是最大值的时候
  49. void SortInsert(DataType data)
  50. {
  51. Node *p = head;
  52. do
  53. {
  54. if (p->next == NULL || p->next->data > data)
  55. {
  56. Node *pNew = new Node;
  57. pNew->data = data;
  58. pNew->next = p->next;
  59. p->next = pNew;
  60.  
  61. return;
  62. }
  63. p = p->next;
  64. } while (true);
  65. }
  66. //尾插法直接插入
  67. void Insert(DataType data)
  68. {
  69. Node *p = head;
  70. while(p->next != NULL)
  71. {
  72. p = p->next;
  73. }
  74.  
  75. Node *pNew = new Node;
  76. pNew->data = data;
  77. pNew->next = NULL;
  78. p->next = pNew;
  79. }
  80. bool Empty()
  81. {
  82. return head->next == NULL;
  83. }
  84. //去掉首结点并返回首结点的值
  85. int ExtractDate()
  86. {
  87. if (! Empty())
  88. {
  89. DataType data = head->next->data;
  90. Node *p = head->next;
  91. Node *pFirst = p->next;
  92.  
  93. delete p;
  94. p = NULL;
  95.  
  96. head->next = pFirst;
  97. return data;
  98. }
  99. return -;
  100. }
  101. };
  102. //冒泡排序
  103. void BubbleSort(int *a, int size)
  104. {
  105. for(int i=; i<size; ++i)
  106. {
  107. for (int j=; j<size--i; ++j)
  108. {
  109. if (a[j] > a[j+])
  110. {
  111. int tmp = a[j];
  112. a[j] = a[j+];
  113. a[j+] = tmp;
  114. }
  115. }
  116. }
  117. }
  118. //基于一个前提:待排序的n个元素大小是介于 0~k 之间的整数
  119. //array待排序数组,result辅助数组存储排序结果,k为允许的最大整数
  120. void BucketSort(int array[], int result[], int size, int k)
  121. {
  122. Link *Bucket = new Link[]; //建立桶
  123. int sectionSize = k/; //记录区间大小
  124. int index=; //记录区间下标
  125.  
  126. //方法1:一般步骤
  127. //按照范围把array中的每个值放入相应的桶中
  128. for(int i=; i<size; ++i)
  129. {
  130. index = array[i]/sectionSize;
  131. Bucket[index].Insert(array[i]); //为保证稳定性,链表使用了尾插法插入
  132. }
  133. //遍历每个桶,取出桶中的元素,放入辅助数组result,并排序
  134. int j= , m=;
  135. for (int i=; i<; ++i)
  136. {
  137. m = j; //记录已排好序的数组元素大小
  138. while(!Bucket[i].Empty())
  139. {
  140. result[j++] = Bucket[i].ExtractDate();
  141. }
  142.  
  143. //可根据实际情况选择快速排序,堆排序等,此处简单起见选择冒泡排序
  144. BubbleSort(result+m, j-m);
  145. }
  146.  
  147. //方法2:使用链表特性,在插入链表的同时排序
  148. //for(int i=0; i<size; ++i)
  149. //{
  150. // index = array[i]/sectionSize;
  151. // Bucket[index].SortInsert(array[i]);
  152. //}
  153. //int j=0;
  154. //for(int i=0; i<5; ++i)
  155. //{
  156. // while(!Bucket[i].Empty())
  157. // {
  158. // result[j++] = Bucket[i].ExtractDate();
  159. // }
  160. //}
  161.  
  162. delete [] Bucket;
  163. }
  164.  
  165. void main()
  166. {
  167. //检测是否有内存泄露 需要加头文件#include <crtdbg.h>
  168. _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
  169.  
  170. int Array[] = {, , , , , , , , , };
  171. int Result[] = {};
  172.  
  173. BucketSort(Array, Result, sizeof(Array)/sizeof(Array[]), );
  174.  
  175. for (int i= ; i < ; ++i)
  176. {
  177. cout << Result[i] << "\n";
  178. }
  179.  
  180. system("pause");
  181. }

(转载请注明作者和出处^_*  Seven++ http://www.cnblogs.com/sevenPP/  )

桶排序(BucketSort)的更多相关文章

  1. Java基础知识强化51:经典排序之桶排序(BucketSort)

    1. 首先说明三点: (1)桶排序是稳定的 (2)桶排序是常见排序里最快的一种,比快排还要快…大多数情况下 (3)桶排序非常快,但是同时也非常耗空间,基本上是最耗空间的一种排序算法 2. 桶排序的分析 ...

  2. 基于非比較的排序:计数排序(countSort),桶排序(bucketSort),基数排序(radixSort)

    计数排序 条件:要排序的数组的元素必须是在一定范围的,比方是1~100.在排序之前我们必须知道数组元素的范围. 思路:顾名思义:就是用一个数组来计数的. 步骤: 1.用一个数组来计数count[ ], ...

  3. BucketSort(桶排序)原理及C++代码实现

    桶排序假设输入数据服从均匀分布,平均情况下它的时间复杂度为O(n). 桶排序将输入数据的区间均匀分成若干份,每一份称作“桶”.分别对每一个桶的内容进行排序,再按桶的顺序输出则完成排序. 通常使用链表来 ...

  4. 计数排序和桶排序(Java实现)

    目录 比较和非比较的区别 计数排序 计数排序适用数据范围 过程分析 桶排序 网络流传桶排序算法勘误 桶排序适用数据范围 过程分析 比较和非比较的区别 常见的快速排序.归并排序.堆排序.冒泡排序等属于比 ...

  5. Java排序算法——桶排序

    文字部分为转载:http://hxraid.iteye.com/blog/647759 对N个关键字进行桶排序的时间复杂度分为两个部分: (1) 循环计算每个关键字的桶映射函数,这个时间复杂度是O(N ...

  6. Hark的数据结构与算法练习之桶排序

    算法说明 桶排序的逻辑其实特别好理解,它是一种纯粹的分而治之的排序方法. 举个例子简单说一下大家就知道精髓了. 假如对11,4,2,13,22,24,20 进行排序. 那么,我们将4和2放在一起,将1 ...

  7. Python线性时间排序——桶排序、基数排序与计数排序

    1. 桶排序 1.1 范围为1-M的桶排序 如果有一个数组A,包含N个整数,值从1到M,我们可以得到一种非常快速的排序,桶排序(bucket sort).留置一个数组S,里面含有M个桶,初始化为0.然 ...

  8. 桶排序与基数排序代码(JAVA)

      桶排序 publicstaticvoid bucketSort(int[] a,int max){         int[] buckets;           if(a==null || m ...

  9. Java实现桶排序和基数排序

    桶排序代码: import java.util.Arrays; /** * 桶排序 * 工作的原理是将数组分到有限数量的桶里 * 每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序 ...

随机推荐

  1. JNI-数据类型

    转载:http://blog.csdn.net/conowen/article/details/7523145 在Java中有两类数据类型:primitive types,如,int, float, ...

  2. <meta 标签的详细使用

    meta是用来在HTML文档中模拟HTTP协议的响应头报文.meta 标签用于网页的<head>与</head>中,meta   标签的用处很多.meta  的属性有两种:na ...

  3. Scribefire发CSDN博客

    历史 在非常久非常久曾经,CSDN是支持外部工具来写文章的,但是在还有一个非常久非常久曾经就不行了. 突然看到CSDN有能够用外部工具来写博客了(CSDN的公告),一直以来都纠结这个问题,CSDN的编 ...

  4. 提高你的Java代码质量吧:如果有必要,使用变长数组吧

    一.分析  Java中的数组是定长的,一旦经过初始化声明就不可改变长度,这在实际使用中非常不方便. 二.场景  比如要对班级学生的信息进行统计,因为我们不知道一个班级会有多少学生(随时都有可能会有学生 ...

  5. Tricks Device (hdu 5294 最短路+最大流)

    Tricks Device Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To ...

  6. ClientKey实现登录QQ空间,并设置背景音乐

    ClientKey大家都知道的,通过webbrowser登录后取得Cookie并计算出GTK,即可操作空间的POST. 源代码中引用了苏飞的Http类库,自己修改添加了一些拓展方法. 下载地址:htt ...

  7. java与c++的访问权限的问题

    转自网络:http://blog.sina.com.cn/s/blog_4bc954d30100wtxe.html 权限的理解重要理解什么是可见什么是不可见 首先声明:java中,friendly这个 ...

  8. 如何真正免费运营推广APP应用

    随着移动终端的迅速普及,各类APP如雨后春笋般涌现出来,但是真正的运营成功的产品却寥寥无几. 从瓜分渠道资源到抢占用户的过程中,很多同行都明显的感觉到,渠道平台所带来的量日益减少,但是刊例价格却一再攀 ...

  9. jemalloc源码结构分析(一):内存申请处理过程

    一.5种malloc方法 1)tcache_alloc_small 2)arena_malloc_small 3)tcache_alloc_large 4)arena_malloc_large 5)h ...

  10. HeaderTemplate

    前台代码: <asp:Repeater ID="rptList" runat="server" onitemdatabound="doSomet ...