九大经典算法之基数排序、桶排序
08 基数排序(Radix Sort)
基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。排序过程是将所有待比较数值统一为同样的数位长度,数位较短的数前面补零,然后从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
int getMax(int arr[], int n) { int mx = arr[0]; for (int i = 1; i < n; i++) if (arr[i] > mx) mx = arr[i]; return mx; } void countSort(int arr[], int n, int exp) { int output[n]; int i, count[10] = {0}; for (i = 0; i < n; i++) count[ (arr[i]/exp)%10 ]++; for (i = 1; i < 10; i++) count[i] += count[i - 1]; for (i = n - 1; i >= 0; i--) { output[count[ (arr[i]/exp)%10 ] - 1] = arr[i]; count[ (arr[i]/exp)%10 ]--; } for (i = 0; i < n; i++) arr[i] = output[i]; } void radixsort(int arr[], int n) { int m = getMax(arr, n); for (int exp = 1; m/exp > 0; exp *= 10) countSort(arr, n, exp); }
空间效率:O(r)
时间效率:最好情况:O(d(n+r)) 平均情况:O(d(n+r)) 最坏情况:O(d(n+r))
稳定性(相同元素相对位置变化情况):稳定
09 桶排序(Bucket Sort)
桶排序的原理是将数组分到有限数量的桶中,再对每个桶子再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后将各个桶中的数据有序的合并起来。
排序过程:
- 假设待排序的一组数统一的分布在一个范围中,并将这一范围划分成几个子范围,也就是桶
- 将待排序的一组数,分档规入这些子桶,并将桶中的数据进行排序
- 将各个桶中的数据有序的合并起来
void bucketSort(int arr[], int n) { vector<float> b[n]; for (int i=0; i<n; i++) { int bi = n*arr[i]; b[bi].push_back(arr[i]); } for (int i=0; i<n; i++) sort(b[i].begin(), b[i].end()); int index = 0; for (int i = 0; i < n; i++) for (int j = 0; j < b[i].size(); j++) arr[index++] = b[i][j]; }
空间效率:O(N+M)
时间效率:最好情况:O(N) 平均情况:O(N) 最坏情况:O(Nlog2N)
稳定性(相同元素相对位置变化情况):稳定
转载于:https://www.cnblogs.com/wanghao-boke/p/10424469.html
九大经典算法之基数排序、桶排序相关推荐
- 九大经典算法之选择排序、堆排序
05 选择排序 (Selection Sort) 原理:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序 ...
- 九大经典算法之插入排序、希尔排序
01 插入排序(Insertion Sort) 原理:每次选择一个元素,并且将这个元素和整个数组中的所有元素进行比较,然后插入到合适的位置. void insertion_sort(int arr[] ...
- 九大经典算法之归并排序
07 归并排序 (Merge Sort) 归并操作的工作原理如下: 第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列: 第二步:设定两个指针,最初位置分别为两个已经排序序列 ...
- 九大经典算法之冒泡排序、快速排序
03 冒泡排序(Bubble Sort) 每次选择两个元素,按照需求进行交换(比如需要升序排列的话,把较大的元素放在靠后一些的位置),循环 n 次(n 为总元素个数),这样小的元素会不断 " ...
- JS的十大经典算法排序
更正(2018/5/31):如果看的是原文章的话,注意希尔排序少一个等号,在本博中,我已经添加上了,希尔排序(更正后)及以前的经测试都是正确的,后面的我正找时间持续研究验证中--(过程可能有点慢) 更 ...
- 「干货」编程语言十大经典算法,你知道几个?
算法与数据结构是计算机学习路上的内功心法,也是学好编程语言的重要基础.今天给大家介绍一下十大经典算法. 十大经典算法分别是:冒泡排序,插入排序,选择排序,希尔排序,快速排序,归并排序,桶排序,堆排序, ...
- 十大经典算法总结(JavaScript描述)
前言 读者自行尝试可以想看源码戳这,博主在github建了个库,欢迎star.读者可以Clone下来本地尝试.此博文配合源码体验更棒哦~~~ 个人博客:Damonare的个人博客 原文地址:十大经典算 ...
- 数据挖掘十大经典算法(详解)
数据挖掘十大经典算法 一. C4.5 C4.5算法是机器学习算法中的一种分类决策树算法 ...
- DataMining学习2_数据挖掘十大经典算法
数据挖掘十大经典算法 一. C4.5 C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3 算法. C4.5算法继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进: ...
最新文章
- php网站首页点击更多时获取数据,jQuery+PHP实现点击按钮加载更多,不刷新页面加载更多数据!附:可用源码+demo...
- 非索引查询如何提高效率_Python数据分析:数据库索引如何提高效率?
- synchronized与java.util.concurrent.locks.Lock的相同之处和不同之处
- golang处理kill命令总结
- 程学旗 计算机,徐明伟-青年科学家奖-中国计算机学会
- 【转载保存】B+树索引原理以及应用案例
- Asp.Net Mvc表单提交之List集合
- 2019年文章精选,分类整理,顺带聊几句时间观念
- 埃里克贝里奇_9大热门技术的安全隐患
- 升级php5.5.10扩展不兼容
- 浅谈算法和数据结构: 十一 哈希表
- Python的动态特性(类实例增加属性,动态变量类型)
- android获取GPS权限
- python训练模型一直循环怎么办_用pycharm编写程序进行模型训练时总是有memory error错误,如何解决?...
- 中国物流网很难进入运输颓势
- ArcGIS地理要素数据获取及地图制作
- 联想电脑计算机无法正常启动怎么办,电脑蓝屏无法启动怎么办
- SAP SMARTFORMS打印文本内容手动换行
- 如何保障邮件内容安全
- 极路由2运行python安装_极路由4pro(HC5962)安装python
热门文章
- C语言 · 芯片测试
- JavaScript封装方法,兼容参数类型为Number和String
- QuartZ.net 常用配置说明
- mybatis06 增删改差 源码
- mysql游标遍历数据库_MySQL数据库中,使用游标循环遍历_MySQL
- python实现矩阵叉乘_矩阵乘法的纯Python实现 | 离开Python库!!
- 工业机器人用铸铁牌号_常用铸铁牌号
- android dropbox anr分析,Android如何分析排查ANR
- 安卓linux开机画面,Android系统的开机画面显示过程分析(1)
- 《MySQL tips:查询时,尽量不要对字段进行操作》