博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
桶排序
阅读量:4449 次
发布时间:2019-06-07

本文共 2630 字,大约阅读时间需要 8 分钟。

【1】桶排序

桶排序(也称箱排序),据坊间演绎,其实现方式有很多。

在此我们仅仅阐述一下本文的实现思想,以便于更好的理解下面的内容,同时加深对桶排序的认识。

首先,说明一点,我们是使用数组模拟桶(最好应该是使用链表模拟)。

所谓数组模拟桶实现排序的过程到底是怎么进行的呢?呵呵!其实还真有点抽象。

实现步骤如下:

(1)定义映射函数 

<1>求得欲排数据序列中的最大数据。

<2>通过遍历欲排数据对每个数据乘以10再与最大数据取余,求得每个数据对应桶的索引(或称关键字)。

(2)求得每个桶中盛放的数据个数(为了保证随后准确分配数据)

(3)求得每个桶盛放数据个数的右边界索引(所谓的桶逻辑控制)

(4)从右向左(确保稳定性)扫描欲排数据序列,依次分配到对应桶中

(5)对各桶中所盛数据进行收集

(6)利用插入排序再对各个桶中所盛数据进行排序

(7)直至排序结束,即为已排序数据序列

其实,整个过程再讲通俗一点,可以如下描述:

建立一个数组作为我们的所谓的桶(逻辑桶)

然后,申请开辟与欲排数据所占空间相同的内存,作为真正的盛放数据的桶(物理桶)

数组的索引默认为桶号

对数组的每一次赋值都有着不同的意义(请参考代码分析)

最后再用插入排序对各桶中所收集数据分别进行排序。即完成桶排序。

总而言之:先分类,后收集,再排序。

【2】示例代码及其分析过程

(1)代码如下:

1 #include
2 #include
3 using namespace std; 4 5 6 void PrintArr(int ar[],int n) 7 { 8 for(int i = 0; i < n; ++i) 9 cout<
<<" "; 10 cout<
= begin && v
max) 53 max = ar[i]; 54 } 55 56 //统计各桶需要装的元素的个数 57 for(i = begin; i < size; ++i) 58 { 59 count[MapToIndex(ar[i], max)]++; 60 } 61 62 //输出计数结果: 63 PrintArr(count, radix); 64 65 //求出桶的边界索引,count[i]为第i个桶的右边界索引+1 66 for(i = 1; i < radix; ++i) 67 { 68 count[i] = count[i] + count[i-1]; 69 } 70 71 //输出桶边界索引 72 PrintArr(count, radix); 73 74 //从右向左扫描,保证排序稳定性 75 for(i = end; i >= begin; --i) 76 { 77 j = MapToIndex(ar[i], max); 78 Temp[count[j]-1] = ar[i]; //放入对应的空间中,count[j]-1是第j个桶的右边界索引 79 --count[j]; //准备放置下一个元素的位置索引 80 } 81 82 for(int i = 0; i < size; ++i) 83 { 84 cout<
<<" "; 85 } 86 cout<

(2)分析过程如下:

学过数据结构的估计都可以想象得到:桶排序中所谓的桶应该是用一个单链表实现

因为,我们一直觉得,计算机世界就是对现实世界的模拟。那么,既然是山寨,当然越逼真越好

但是,假如我们没有学习过单链表,脑子里面根本没有单链表的概念。而且,我们要实现桶排序。

好吧!我唯一可以借助的就是数组。

不过数组模拟桶实现桶排序的确不是很好理解,有几分抽象

上面这就是一个用数组模拟桶实现的桶排序示例代码,现在做一下具体分析,希望可以更深刻理解桶排序。

分析过程如下:

(1)待排序数据序列为:

(2)count数组本质上是逻辑的桶,为什么说是逻辑上的桶?因为,它控制着桶的所有数据逻辑

但是申请的内存Temp才是每个桶的真正储存空间,所以只能说是逻辑上的桶。

而当数据被分配到各个桶中又从桶(即就是从申请空间)被收集之后,就对申请空间进行释放(因为留着再没有必要)。

如何理解以上内容?请结合一下图示理解具体分析:

 

第一行:所建桶的索引(可以看到总共为11个桶)

为什么是11个桶?由我们在对待排数据求输入桶对应的索引时匹配函数(MapToIndex)决定。

由于最大数据输入匹配函数后所得桶对应索引为10。所以,在此必须如此设计。

第二行:所有桶置空

第三行:每个桶中待盛的数据个数

第四行:每个桶的右边界索引

如何理解右边界索引?

比如0号桶,第三行已经得出其待盛四个数据,那么将来数据就会存入Temp[0],Temp[1],Temp[2],Temp[3]

比如1号桶,第三行已经得出其待盛三个数据,那么将来数据就会存入Temp[4],Temp[5],Temp[6]

第五行:待排数据全部放入各个桶中后,桶的左边界索引(这个是为了下面插入排序使用)。

(3)对每一个桶(即就是申请空间)中所盛的数据再利用插入排序进行排序

(4)数组中的数据即为已排序序列

【3】桶排序分析

桶排序是稳定排序算法。

桶排序使用范围比较窄。

 

Good Good Study, Day Day Up.

顺序  选择  循环  坚持  总结

转载于:https://www.cnblogs.com/Braveliu/archive/2013/01/19/2867163.html

你可能感兴趣的文章
SDOI2011 染色
查看>>
HTTP协议详解
查看>>
JQuery EasyUI combobox动态添加option
查看>>
面向连接的TCP概述
查看>>
前端快捷方式 [记录]
查看>>
亲测可用,解决端口被占用的指令!!
查看>>
Leetcode--287
查看>>
爬虫--百度图片
查看>>
git中由readme.md文件引发的问题
查看>>
MySQL--视图、触发器、事务、存储过程、内置函数、流程控制、索引
查看>>
Django--登录功能
查看>>
GitHub and Git
查看>>
Django--数据库查询操作
查看>>
MySQL--修改Mac中的默认编码
查看>>
Django--模版层
查看>>
git中的错误
查看>>
Docker--安装MySQL
查看>>
FakeUserAgentError('Maximum amount of retries reached') 彻底解决办法
查看>>
redis中重启和停止服务
查看>>
Django--form表单组件
查看>>