线性时间排序C++代码集合(计数排序,基数排序,桶排序([0~1)的浮点数))
来源:互联网 发布:淘宝店9.9包邮 编辑:程序博客网 时间:2024/06/05 03:35
1. 计数排序
输入:待排序数组 vec
输出:排序结果数组 res
占用额外空间:max_value(vec) 大小的数组
void countSort(vector<int> & vec,vector<int> & result){vector<int> c_vec;result.resize(vec.size());for (auto val : vec){if (c_vec.size() <= val + 1) //范围为0~n的数据,共有 n + 1 种取值,包含0c_vec.resize(val + 1,0);c_vec[val] += 1;}//adjust c_vecfor (int i = 1; i != c_vec.size(); ++i)c_vec[i] += c_vec[i - 1];//adjustfor (auto val : vec) //此时从后往前遍历 vec 并放入元素,则计数排序的结果是稳定的。按照当前写法不稳定{result[c_vec[val]-1] = val; //当前排名为n 的数据,在vec 中的下标为[n-1],下标从0开始--c_vec[val];}}
2.基数排序
输入:待排序数组
void radixSort(vector<int>& vec){vector<int> tmp(vec.size(), 0);vector<int> bucket(10, 0); //桶中存放 0 ~ 9int max_num = INT_MIN;//用来统计最高位,用于终止循环std::for_each(vec.begin(), vec.end(), [&max_num](int i)mutable{if (i > max_num) max_num = i; });int bits_count = 1;while ((max_num / bits_count)){//获取位数for (auto val : vec)bucket[(val / bits_count) % 10] += 1;//统计排序for (size_t i = 1; i != bucket.size(); ++i)bucket[i] += bucket[i - 1];//根据统计的排序值,将值放入临时存储区。**特别注意此处必须从后往前找数据,因为根据计数的原理,桶中的排序是从后往前的for (auto iter = vec.rbegin(); iter != vec.rend(); ++iter){int val = *iter;tmp[bucket[(val / bits_count) % 10] - 1] = val;--bucket[(val / bits_count) % 10];}//将临时存储区的值转回原存储for (size_t i = 0; i != tmp.size(); ++i)vec[i] = tmp[i];//清空桶for (auto & val : bucket)val = 0;//累计当前值bits_count *= 10;}}
3.桶排序
输入:在[0~1)均匀分布的浮点数
稳定性:稳定
struct Node{double fval;shared_ptr<Node> next;shared_ptr<Node> prev;Node(float f) :fval(f), next(nullptr), prev(nullptr){}};//对 [0,1) 内均匀分布的小数进行排序void bucketSort(vector<double> &vec){map<int, shared_ptr<Node>> bucket;//桶,每个桶中放了一个链表,链表中的元素使用插入排序for (auto fval : vec){int bits = static_cast<int>(fval * 10) % 10; //取出小数点后第一位shared_ptr<Node> point(new Node(fval));//构造新节点,用智能指针控制堆内存的释放shared_ptr<Node> root = bucket[bits];//取出当前桶的根节点if (root == NULL)//空桶,放入第一个元素即可{bucket[bits] = point;continue;}shared_ptr<Node> prev = NULL,curr = root;//开始插入排序while (curr != NULL){if (curr->fval <= fval) //迭代器向后移动备注:使用小于等于保持稳定性{prev = curr;curr = curr->next;}elsebreak;}point->prev = prev;//将当前结点接入链表point->next = curr;if (prev != NULL)//头节点为空,则当前节点应该为桶中的根节点prev->next = point;elsebucket[bits] = point;//替换掉根节点if (curr != NULL)curr->prev = point;//接入链表中}size_t index = 0;for (auto iter = bucket.begin(); iter != bucket.end(); ++iter) //map 按关键字 0 ~ 9 自动排序,即是取出按桶的顺序取出{shared_ptr<Node> root = iter->second;while (root != NULL){vec[index++] = root->fval; //获取值root = root->next;}}}
0 0
- 线性时间排序C++代码集合(计数排序,基数排序,桶排序([0~1)的浮点数))
- 数据结构与算法——线性时间排序(计数排序、基数排序、桶排序)
- 算法导论 第8章 线性时间排序(计数排序、基数排序、桶排序)
- 五 线性时间排序(基数排序、计数排序和桶排序)
- 线性时间排序——计数排序,基数排序,桶排序
- 算法导论-- 线性时间排序(计数排序、基数排序、桶排序)
- 线性时间排序之计数排序,基数排序和桶排序
- 线性时间排序(计数排序/桶排序/基数排序)
- 线性时间排序--计数排序、基数排序、桶排序
- 线性时间排序(计数排序、基数排序、桶排序)
- 线性时间排序:计数排序、基数排序、桶排序
- 线性排序----计数排序, 基数排序, 桶排序
- 【排序】基数排序(计数排序、桶排序)
- 【算法导论】第五课 线性排序(基数排序 计数排序)
- 线性排序算法(计数排序,基数排序,桶排序)分析及实现
- 【算法学习】线性时间排序-计数排序、基数排序和桶排序详解与编程实现
- 【算法学习】线性时间排序-计数排序、基数排序和桶排序详解与编程实现
- MIT:算法导论——5.线性时间排序:计数排序、基数排序以及桶排序
- JDK常用的package
- C#读取文本文件
- JavaScript DOM 操作总结
- SecureCRT连接Ubuntu失败(远程系统拒绝访问)
- Caffe基础介绍
- 线性时间排序C++代码集合(计数排序,基数排序,桶排序([0~1)的浮点数))
- unity3d进程通信利用WM_COPYDATE和HOOK
- PHP学习SELECT postgresql正则表达式 cookie同一站点IP访问和域名访问 T检验
- UITextField
- cell里面 self 和self.contentview的区别
- Python日志模块logging的使用
- STC15W4K32S4 系列 T0定时器输出时钟
- AndFix解析——(下)
- CCIM安装教程