算法导论------------桶排序算法之研究
2016-02-24 13:58
363 查看
举个来说明桶排序的过程,如果如今有A={0.78,0.17,0.39,0.26,0.72,0.94,0.21,0.12,0.23,0.68},桶排序例如以下所看到的:
研究过计数排序我们知道了————计数排序是如果输入是由一个小范围内的整数构成。而桶排序则如果输入由一个随机过程产生的,该过程将元素均匀而独立地分布在区间[0。1)上。当桶排序的输入符合均匀分布时,即能够线性期望时间执行。桶排序的思想是:把区间[0,1)划分成n个同样大小的子区间,成为桶(bucket),然后将n个输入数分布到各个桶中去。对各个桶中的数进行排序。然后依照次序把各个桶中的元素列出来就可以。
数中给出了桶排序的伪代码,如果输入是一个含有n个元素的数组A,且每一个元素满足0≤A[i]<1,另外须要一个辅助数组B[0....n-1]来存放链表(桶)。
伪代码例如以下所看到的:
BUCKET_SORT(A)
n = length(A)
for i= 1 to n
do insert A[i] into list B
for i=0 to n-1
do sort list B[i] with insertion sort
concatenate the list B[0]、B[1],,,B[n-1] together in order
如今依据伪代码实现真正的桶排序。这里使用了c++的方法以及STL中的list以及迭代器的功能。
以及在桶中使用了插入排序的算法的来对桶中元素进行排序。
研究过计数排序我们知道了————计数排序是如果输入是由一个小范围内的整数构成。而桶排序则如果输入由一个随机过程产生的,该过程将元素均匀而独立地分布在区间[0。1)上。当桶排序的输入符合均匀分布时,即能够线性期望时间执行。桶排序的思想是:把区间[0,1)划分成n个同样大小的子区间,成为桶(bucket),然后将n个输入数分布到各个桶中去。对各个桶中的数进行排序。然后依照次序把各个桶中的元素列出来就可以。
数中给出了桶排序的伪代码,如果输入是一个含有n个元素的数组A,且每一个元素满足0≤A[i]<1,另外须要一个辅助数组B[0....n-1]来存放链表(桶)。
伪代码例如以下所看到的:
BUCKET_SORT(A)
n = length(A)
for i= 1 to n
do insert A[i] into list B
for i=0 to n-1
do sort list B[i] with insertion sort
concatenate the list B[0]、B[1],,,B[n-1] together in order
如今依据伪代码实现真正的桶排序。这里使用了c++的方法以及STL中的list以及迭代器的功能。
以及在桶中使用了插入排序的算法的来对桶中元素进行排序。
<pre name="code" class="cpp">#include <iostream> #include <vector> #include <list> #include <cstdlib> using namespace std; void bucket_sort(float *datas, size_t length) { int i, j; int index; float fvalue; size_t lsize; list<float> *retlist = new list<float>[length]; list<float>::iterator iter; list<float>::iterator prioiter, enditer; for (i = 0; i<length; ++i) { index = static_cast<int>(datas[i] * 10); //insert a new element retlist[index].push_back(datas[i]); lsize = retlist[index].size(); if (lsize > 1) { //get the last element in the list[index] iter = --retlist[index].end(); fvalue = *iter; enditer = retlist[index].begin(); //insert the last element in right position while (iter != enditer) { //get the second last element in the list[index] prioiter = --iter; //back up iter to the last element in the list[index] iter++; //compare two float values if (*(prioiter)-*iter > 0.000001) { float temp = *(prioiter); *(prioiter) = *iter; *iter = temp; } iter--; } //the right inserted position *(++iter) = fvalue; } } //copy the result to datas j = 0; for (int i = 0; i<length; i++) { for (iter = retlist[i].begin(); iter != retlist[i].end(); ++iter) datas[j++] = *iter;a } delete[] retlist; } int main() { float datas[10] = { 0.78f, 0.17f, 0.39f, 0.76f, 0.23f, 0.67f, 0.48f, 0.58f, 0.92f, 0.12f }; bucket_sort(datas, 10); cout << "after bucket_sort the result is:" << endl; for (int i = 0; i<10; i++) cout << datas[i] << " "; cout << endl; exit(0); }
相关文章推荐
- 在win7/8/10鼠标右键添加“管理员取得所有权”
- QuickSort 递归 分治
- Git用法之分支管理和分支开发工作流
- new (std::nothrow) 与 new
- js刷新页面的几种方法
- cocoapods卡在Updating local specs repositories
- 无限循环的ScrollView,原理以及实现,自动循环!!!
- android layout_weight难点解析
- mysql 忽略主键冲突、避免重复插入的几种方式
- 回首2015,展望2016
- NSData
- 在Eclipse中打开Hadoop工程
- 2016年寒假读书笔记
- Android stuido 导入项目注意事项
- 关于执行力的50句名言
- html5 ajax文件上传
- libgdx [Animation]
- iOS打电话、发短信、发邮件开发
- Badboy - 导出脚本,用于JMeter并发测试
- Vi/Vim查找替换使用方法