第8章:线性时间排序
来源:互联网 发布:电脑软件 知乎 编辑:程序博客网 时间:2024/06/07 21:11
一:计数排序:
计数排序假设n个输入元素中的每一个都是在0到k区间内的一个整数,其中k为某个整数,当k=O(n)时,排序的运行时间为
代码如下:
void countingSort(vector<unsigned int>& array){ if(array.size()==0) throw underflow_error("the array is empty."); if(array.size()==1) return; unsigned int maxValue=0; for(int i=0;i!=array.size();++i) if(maxValue<=array[i]) maxValue=array[i]; vector<unsigned int> countArray(maxValue+1); // countArray[i] contains the number of elements less than or equal to i; vector<unsigned int> sortedArray(array.size()); for(int i=0;i!=array.size();++i) countArray[array[i]]+=1; for(int i=1;i!=countArray.size();++i) countArray[i]+=countArray[i-1]; for(int i=array.size()-1;i>=0;--i) { sortedArray[countArray[array[i]]-1]=array[i]; countArray[array[i]]--; } for(int i=0;i!=array.size();++i) array[i]=sortedArray[i];}
二:桶排序:
桶排序假设输入数据服从均匀分布,平均情况下它的时间代价为O(n)。与计数排序类似,因为对输入数据作了某种假设,桶排序的速度也很快。具体来说,计数排序假设输入数据都属于一个小区间内的整数,而桶排序假设输入是一个随机过程产生,该过程将元素均匀,独立地分布在[0,1)区间上。
桶排序将[0,1)区间划分为n个相同大小的子区间,或称为桶。然后,将n个输入数分别放到各个桶中。因为输入数据是均匀,独立地分布在[0,1)区间上,所以一般不会出现很多书落在同一个桶中的情况。为了得到输出结果,我们先对每一个桶中的数进行排序,然后遍历每一个桶,按照次序把各个桶中的元素列出来即可。
代码如下:
void bucketSort(vector<double>& array){ vector< vector<double> > temp(array.size()); for(int i=0;i!=array.size();++i) { temp[(int)(array[i]*array.size())].push_back(array[i]); if(array[i]==1) temp[array.size()-1].push_back(array[i]); } for(int i=0;i!=temp.size();++i) if(temp[i].size()!=0&&temp[i].size()!=1) insertionSort(temp[i]); int index=0; for(int i=0;i!=temp.size();++i) if(temp[i].size()!=0) for(int j=0;j!=temp[i].size();++j) array[index++]=temp[i][j];
0 0
- 第8章:线性时间排序
- 第 8 章 线性时间排序
- 计数排序(第8章线性时间排序)
- 桶排序(第8章:线性时间排序)
- 算法导论学习笔记-第8章 线性时间排序
- 算法导论代码 第8章 线性时间排序
- 算法导论 第8章 线性时间排序
- 算法导论第8章线性时间排序答案
- 算法导论 第8章 线性时间排序 C++实现
- 算法导论第8章—线性时间排序
- 算法导论第8章:线性时间排序
- 算法导论:第8章 线性时间排序__基数排序
- 《算法导论》第8章 线性时间排序 个人笔记
- 算法导论 第8章 线性时间排序-计数排序的原址排序
- 算法导论 第8章 线性时间排序(计数排序、基数排序、桶排序)
- 《算法导论》第8章 线性时间排序 (1)计数排序
- 算法导论:第8章 线性时间排序__计数排序
- 2011-03-06 算法导论 第8章 线性时间排序
- Retrofit + RxJava 业务状态重定向及分离
- 一、C++ 位运算
- 一个ForkJoin并行任务的实际应用
- 5.30 convexhull.cpp 学习
- 获取spring容器要小心的坑
- 第8章:线性时间排序
- iOS 多线程篇10—NSOperation基本操作
- use prebuild static lib on another android project
- 修改eclipse中的svn用户名和密码
- 深入理解JVM—JVM内存模型
- Install ArchlinuxARM and Setup
- vSphere 查看FC HBA的WWNN和WWPN
- QT学习笔记
- 第9章:中位数和顺序统计量