桶排序的数组实现

桶排序Bucket Sort从1956年就开始被使用,该算法的基本思想是由E. J. Issac R. C. Singleton提出来。

桶排序(Bucket Sort)是迄今为止最快的一种排序法,其时间复杂度仅为Ο(n),也就是线性复杂度!不可思议吧?但它是有条件的

桶排序(BucketSort) 小结:

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)+m*O(n/m log(n/m))

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

举个例子:

某一年的全国高考考生人数为500万,数学一科分数使用标准分,最低0,最高150,没有小数,你把这500万元素的数组排个序。我们抓住了这么个非常特殊的条件,就能在毫秒级内完成这500万的排序,那就是:最低0,最高150,没有小数,那一共可出现的分数可能有多少种呢?一共有150-0+1=151,那么多种,想想看,有没有什么“投机取巧”的办法?方法就是创建151个“桶”,从头到尾遍历一次数组,对不同的分数给不同的“桶”加料,比如有个考生考了140分,那么就给140分的那个桶(下标为140-100)加1,完成后遍历一下这个桶数组,按照桶值,填充原数组,100分的有1000人,于是从0填到999,都填100,102分的有1200人,于是从1000到2019,都填入102…

可运行的代码:

// buckets sort in arrays, the same element in each bucket

#include

#include // memset函数在此头文件中定义

#define MAX_LEN 100

using namespace std;

int main()

{

int arr[]={3,1,4,8,2,13,3,5,2}; // 简单情形:没有小数(如果有小数,可以考虑先整体*10^n,n为小数位最大值,后面再复原)

int i, bucket[MAX_LEN];

memset(bucket,0,sizeof(bucket)); // 用多个桶分别来记录相应索引i在原数组arr中出现的次数,全初始化为0

int ElemNum=sizeof(arr)/sizeof(arr[0]); // 计算原序列中数的个数,记为ElemNum

for(i=0;i

{

int v=arr[i];

bucket[v]++; // 记录相应索引i在原数组arr中出现的次数,没有出现的元素,存默认的0到数组bucket中

}

for(i=0;i

{

while(bucket[i]>0)

{

cout<

bucket[i]--;

}

}

cout<

return 0;

}

可从控制台输入的程序:

#include

#include

using namespace std;

int main()

{

int arr[100],n,c,i;

while(1)

{

cin>>n;

memset(arr,0,sizeof(arr));

for(i=0;i

{

cin>>c;

arr[c]++;

}

for(i=0;i<100;i++)

{

while(arr[i]>0)

{

cout<

arr[i]--;

}

}

cout<

}

return 0;

}

最简单的C语言实现:

#include

int main()

{

int bucket[1001],i,j,temp,n;

for(i=0;i<=1000;i++)

bucket[i]=0;

scanf("%d",&n); //输入一个数n,表示接下来有n个数

for(i=1;i<=n;i++) //循环读入n个数,并进行桶排序

{

scanf("%d",&temp); //把每一个数读到变量temp中

bucket[temp]++; //进行计数,对编号为temp的桶放一个小旗子

}

for(i=0;i<=1000;i++) //依次判断编号1000~0的桶

for(j=1;j<=bucket[i];j++) //出现了几次就将桶的编号打印几次

printf("%d ",i);

getchar();

return 0;

}

桶排序c语言,桶排序(Bucket Sort)的数组实现相关推荐

  1. python如何给字符串排序_Python语言字符串排序方法

    本文主要向大家介绍Python语言字符串排序方法了,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 一般情况下,python中对一个字符串排序相当麻烦:一.python中的字符串类 ...

  2. 希尔排序c语言,希尔排序(C/C++实现)

    封装成函数: //交换数组元素 void swap(int *a,int i,int j) { int t = a[i]; a[i] = a[j]; a[j] = t; } //希尔排序 void s ...

  3. c语言选择排序_C语言——选择排序

    1 选择排序(5分) 题目内容:编写选择排序,要求排序过程调用函数实现,在主函数输入n个数据,调用函数后,输出排好序的元素输入格式:输入整型数n,并输入n个整数,输入数据用空格隔开输出格式:输出排好序 ...

  4. 用C语言对单词首字母进行排序,c语言单词排序

    满意答案 ajuum2d8l 推荐于 2017.09.12 采纳率:59%    等级:10 已帮助:674人 程序第一次运行时,会创建一个"word.txt"(不包括引号)的文本 ...

  5. matlab实现希尔排序,C语言希尔排序算法

    用希尔排序法对一组数据由小到大进行排序,数据分别为 69.56.12.136.3.55.46. 99.88.25. 实现过程: (1)自定义函数 shsort(),实现希尔排序. (2) main() ...

  6. C++bucket sort桶排序的实现算法(附完整源码)

    C++bucket sort桶排序的实现算法 C++bucket sort桶排序的实现算法完整源码(定义,实现,main函数测试) C++bucket sort桶排序的实现算法完整源码(定义,实现,m ...

  7. R语言 向量排序与运算

    向量排序 R语言中主要通过sort函数对向量进行排序.格式如下:         sort(x,decreasing = FALSE,na.last = NA,-) 实例:向量排序 sort函数常用参 ...

  8. 桶分类 算法_桶分类算法

    桶分类 算法 桶分类 (Bucket Sort) Bucket sort is a sorting technique in which array is partitioned into the b ...

  9. C语言桶排序Bucket sort算法(附完整源码)

    桶排序Bucket sort算法 桶排序Bucket sort算法的完整源码(定义,实现,main函数测试) 桶排序Bucket sort算法的完整源码(定义,实现,main函数测试) #includ ...

最新文章

  1. 网络工程师应该掌握的50个路由器知识要点
  2. CQRS, Task Based UIs, Event Sourcing agh!
  3. distance from ifm to Sidney Sussex College: acceptable
  4. 第 8 章 容器网络 - 051 - 在 overlay 中运行容器
  5. Android安全机制(2) Android Permission权限控制机制
  6. android4.0支持m3u8格式,【报Bug】安卓下无法播放M3U8格式音频,报错
  7. redis 了 什么地方用到_细节拉满!美团首推“百万级”Redis进阶笔记究竟有什么魅力...
  8. 今天发生在自己身上的搞笑事情是什么呢?
  9. java数据库技术_JAVA数据库技术
  10. mysql驱动有什么用_什么是数据库驱动?
  11. CF18B/01背包
  12. web前端---css基础
  13. 过拟合与欠拟合及解决方法
  14. C语言——计算数组长度
  15. 约瑟夫·寇德卡:成为一个吉普赛人
  16. 基于PaddleSeg实现眼底血管分割——助力医疗人员更高效检测视网膜疾病
  17. Fri Oct 7 10:08:00 UTC 0800 2016日期格式转换为 yyyy-mm-dd hh24:mi:ss (Map实现版)
  18. 木木的常用软件点评(1)------系统必备软件篇
  19. 羧基修饰的聚苯乙烯微球(红色、橙色、绿色)的产品简介
  20. SAP灵活工作流(Flexible Workflow)

热门文章

  1. 文本框取值和点击事件
  2. flstudio怎么用,flstudio20怎么设置中文以及flstudio下载中文版
  3. CCIE 们的那些事   ------之最吊的经历
  4. ip地址管理系统java,一个容易的IP地址管理系统源代码
  5. 4.1Adapter模式
  6. witchit找不到服务器,《witchit》需要什么配置 最低配置要求一览
  7. maven pc配置要求_赛博朋克2077最新PC配置要求,开局职业推荐
  8. 王者客服信息服务器,王者荣耀客服反馈在哪 客服反馈入口位置介绍
  9. 数据库 之连接查询--模糊查询、通配符转义、范围查询
  10. Google浏览器设置暗黑模式、隐身模式