桶排序与基数排序与计数基数排序
2017-07-28 20:40
232 查看
输入只有大小小于M的正整数,可以采用桶式排序。
#include <iostream> #include <vector> #include <string> using namespace std; //基数排序 void radixSort(vector<string> & arr,int stringLen) { const int BUCKETS=256; vector<vector<string>> buckets(BUCKETS); //从低有效位开始对每一位分别进行桶排序 for(int pos=stringLen-1;pos>=0;--pos) { for(string & s:arr) { buckets[s[pos]].push_back(std::move(s)); } int idx=0; for(auto & theBucket:buckets) { for(string & s:theBucket) { arr[idx++]=std::move(s); } theBucket.clear(); } } } //计数基数排序 void countingRadixSort(vector<string> & arr,int stringLen) { const int BUCKETS=256; int N=arr.size(); vector<string> buffer(N); vector<string> *in=&arr; vector<string> *out=&buffer; for(int pos=stringLen-1;pos>=0;--pos) { vector<int> count(BUCKETS+1); //k的项数存在k+1里 for(int i=0;i<N;++i) ++count[(*in)[i][pos]+1]; //k里存放着小于k的项数 for(int b=1;b<=BUCKETS;++b) count[b]+=count[b-1]; //将k放在小于自己项数的值的下标处,写完后加1是为了处理重复的情况。 for(int i=0;i<N;++i) (*out)[count[(*in)[i][pos]]++]=std::move((*in)[i]); std::swap(in, out); } //最终结果始终存放在in指向的数组里,当为奇数时,in指向buffer,所以要将其移到arr if(stringLen%2==1) for(int i=0;i<arr.size();++i) (*out)[i]=std::move((*in)[i]); } int main() { vector<string> arr={"abcde","12345","ABCDE","abdce"}; radixSort(arr, 5); for(auto & s:arr) { cout<<s<<endl; } cout<<"...."<<endl; countingRadixSort(arr, 5); 9be7 for(auto & s:arr) { cout<<s<<endl; } }
相关文章推荐
- 基数排序;最优在O(n)时间内完成;基数排序为按最次要数位->最重要数位一次排序;桶排序;O(n);
- 【算法导论】排序 (四):决策树、线性时间排序(计数、基数、桶排序)
- 基数排序、桶排序
- 计数、基数和桶排序的Python实现
- 基数排序与链式基数排序
- 桶排序升级之基数排序c语言实现10.1.2
- 分配排序---箱排序,基数排序与桶排序及排序选择方法
- 基数排序,计数排序,桶排序
- 【算法学习】线性时间排序-计数排序、基数排序和桶排序详解与编程实现
- 线性时间排序--计数和基数排序
- 基于非比较的排序:计数排序(countSort),桶排序(bucketSort),基数排序(radixSort)
- 排序算法-基数排序_基数排序
- 笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算
- 数据结构与算法——线性时间排序(计数排序、基数排序、桶排序)
- 三种线性排序算法(计数、基数、桶排序)的简单实现
- 基数排序与基数排序
- 计数排序、桶排序和基数排序
- 三种线性排序算法 计数排序、桶排序与基数排序
- 排序基础之非比较的计数排序、桶排序、基数排序(Java实现)
- 线性排序算法(计数排序,基数排序,桶排序)分析及实现