Hark的数据结构与算法练习之基数排序
算法说明
基数排序是基于计数排序的,所以看这个之前要先看一下计数排序对于理解基数排序是很有帮助的(发现计数和基数的音节几乎一致啊)。这个我有写,请点击。
OK,现在你肯定已经熟悉了计数排序,那么我就来说一下基数排序。
所谓基数排序,其实就是分别对数字的个位,十位,百位,百位。。。。分别进行计数排序。
当然可以从个位往上进行计数排序,也可以从高位往个数计数排序,这里我们使用个位往上计数排序的方法。
话说,我想了好半天,不知道从哪里入手说基排(鸡排,哈哈)的思路……好蛋疼
这样,先从与计数排序的区别说起吧,区别在于计数排序是直接对数字进行排序。而基数排序是分别对个位,十位,百位。。。进行排序的。
然后,每个位数中,都有0至9共10个数字(即个数时,其实就是10个数字做排序;十数时,其实也是对10个数字做排序),接着我们对每个数字中的数字进行计数排序(好绕口,意思就是说,当进行个数排序时,个位为1时,所以个位为1的数字进行计排,例如11,21,31,221,411等等)。
所以我们申请的是二维数组int[][] radixBucket = new int[10][length]; (代码27行) 第一维的10存储的就是我们每次都是对10个数分别进行计排。第二维存储的就是对应的要排序的数字啦
同时,因为我们要保证数字的稳定性,当我们把低位的数字进行计排后,要把低位数字输出至原始数组中,然后再进行高位排序。
OK,解释到现在不知道有没有说清楚了。。。我发现我语言表达能力还真的是很差劲啊。
我觉得看代码可能会更清楚些,代码上也有注释,代码如下:
代码
使用的是java
/** 基数排序*/
public class RadixSort {public static void main(String[] args) {int[] arrayData = { 2, 3, 1, 5, 6, 7, 4, 65, 42 };RadixSortMethod(arrayData, 100);for (int integer : arrayData) {System.out.print(integer);System.out.print(" ");}}/** arrayData - 要排序的数据 height - 要排序的步长 如果100,则只排序个位十位*/public static void RadixSortMethod(int[] arrayData, int height) {int maxNum = 0; // 最大值,用于存储桶数据临时数组空间大小for (int data : arrayData) {if (data > maxNum) {maxNum = data;}}int step = 1;int length = arrayData.length;int[][] radixBucket = new int[10][length]; // 二维数组,排序的容器int[] arrayTemp = new int[maxNum + 1]; // 这个是每个桶中的数字个数int num;int index = 0;while (step < height) {for (int data : arrayData) {// 当step=1时统计个数,这时取出个位的数字。// 当step=10时,统计十数,这时取出十位的数字num = data / step % 10;radixBucket[num][arrayTemp[num]] = data;arrayTemp[num]++;}for (int i = 0; i < 10; i++) {if (arrayTemp.length > i && arrayTemp[i] != 0) {for (int j = 0; j < arrayTemp[i]; j++) {arrayData[index] = radixBucket[i][j];index++;}arrayTemp[i] = 0; // 将当前数字个数重置为0,用于下次的统计}}step *= 10;index = 0;}}
}
结果
1 2 3 4 5 6 7 42 65
时间复杂度:
假设步长是s,待排序数组长度是n,数字最大值是m
那么时间复杂度就是O(s(n+(10*m)))=O(s(m+n))
空间复杂度:
待排序数组长度是n,数字最大值是m。
那么空间复杂度就是O(10*n+(m+1))=O(m+n)
稳定性:是稳定的
应用场景:
针对最大值相对比较小的正整数。
Hark的数据结构与算法练习之基数排序相关推荐
- Hark的数据结构与算法练习之珠排序
---恢复内容开始--- 算法说明 珠排序是分布排序的一种. 说实在的,这个排序看起来特别的巧妙,同时也特别好理解,不过不太容易写成代码,哈哈. 这里其实分析的特别好了,我就不画蛇添足啦. 大家看一 ...
- Hark的数据结构与算法练习之锦标赛排序
算法说明 锦标赛排序是选择排序的一种. 实际上堆排序是锦标赛排序的优化版本,它们时间复杂度都是O(nlog2n),不同之处是堆排序的空间复杂度(O(1))远远低于锦标赛的空间复杂度(O(2n-1)) ...
- Hark的数据结构与算法练习之圈排序
算法说明 圈排序是选择排序的一种.其实感觉和快排有一点点像,但根本不同之处就是丫的移动的是当前数字,而不像快排一样移动的是其它数字.根据比较移动到不需要移动时,就代表一圈结束.最终要进行n-1圈的比较 ...
- Hark的数据结构与算法练习之若领图排序ProxymapSort
算法说明 若领图排序是分布排序的一种. 个人理解,若领图排序算是桶排序+计数排序的变异版,桶排序计数排序理解了,那么若领图排序理解起来就会比较容易.区别其实就是存储中间值的方式做了调整-- 话说,这个 ...
- Hark的数据结构与算法练习之图书馆排序
算法说明 图书馆排序是插入排序的变种,典型的以空间换时间的一种方法.我个人感觉这种思路可以学习借鉴,但直接使用的场景应该不大. 我们知道,真正的插入排序通常往前边插入元素后,我们要把后边所有的元素后移 ...
- Hark的数据结构与算法练习之希尔排序
算法说明 希尔排序是插入排序的优化版. 插入排序的最坏时间复杂度是O(n2),但如果要排序的数组是一个几乎有序的数列,那么会降低有效的减低时间复杂度. 希尔排序的目的就是通过一个increment(增 ...
- Hark的数据结构与算法练习之冒泡排序
算法说明: 冒泡排序实际上是使用的最多的排序,逻辑是循环然后对相邻的数字进行比较,并交换数据. 例如有一个数组int[] arrayData = { 2, 3, 1, 5, 6, 7, 4, 65, ...
- Hark的数据结构与算法练习之堆排序
前言 堆排序我是看了好半天别人的博客才有了理解,然后又费了九牛二虎之力才把代码写出来,我发现我的基础真的很差劲啊--不过自己选的路一定要坚持走下去. 我试着把我的理解描述出来,如有不妥之处希望大家可以 ...
- Hark的数据结构与算法练习之计数排序
算法说明 计数排序属于线性排序,它的时间复杂度远远大于常用的比较排序.(计数是O(n),而比较排序不会超过O(nlog2nJ)). 其实计数排序大部分很好理解的,唯一理解起来很蛋疼的是为了保证算法稳定 ...
最新文章
- python常用命令汇总-python数据分析之pandas常用命令整理
- 亿些模板【数论数学】
- zoj 1366 Cash Machine
- golang 数组 最后一个_Golang 内存管理
- 解决Dev c++不能调试问题
- 经典排序算法 - 归并排序Merge sort
- php 字符串偏移量,注意:PHP中未初始化的字符串偏移量
- 解决MFC 窗口创建时 争夺焦点的问题
- C++算法学习(力扣:402. 移掉K位数字)
- 缺少训练样本怎么做实体识别?小样本下的NER解决方法汇总
- java jdbc连接_CPT201 ODBC与JDBC比较
- HDU - 1247 (字典树水题)
- 太极图正确画法_太极图唯一正确的画法
- 价值几百元的EMlog仿大表哥资源网模版
- eclipse mars2汉化包下载
- 002 反相器的动态特性
- 【初赛】初赛提纲 错题本(to be countinue)
- 算法中的大O是什么意思
- win本地安装xxl-job服务
- 自动化恶意软件分析系统Cuckoo安装、配置详解
热门文章
- Selenium+java - 借助autolt完成上传文件操作
- jquery实现页面导航列表点击添加active样式
- ant+svn+tomcat实现项目自动部署
- 使用设置报头x-Frame-Options限制iframe网页嵌套
- oddo docker 安装
- 步步为营(十六)搜索(二)BFS 广度优先搜索
- 我的Android进阶之旅------gt;Android使用AlarmManager全局定时器实现定时更换壁纸
- 10套免费的 Photoshop UI 元素以及 PSD 素材
- Android系统架构图及简单的系统架构介绍
- cocos2d笔记——CCNode与CCAction