基本排序_基数排序_Java实现
转载请注明出处:http://blog.csdn.net/ljmingcom304/article/details/50372591
本文出自:【梁敬明的博客】
1.基数排序 基数排序又称作桶排序,从序列的最低位开始,把当前位数对应的数字按0~9将元素进行归类,遍历到元素中不为0的最高位为止,直到最终完成排序。
文章图片
存在一个序列【19】【82】【137】【22】【5】【431】【23】【20】【11】【109】,将其按照从小到大的顺序进行排列。
第一次分类,选取元素的个位数,按0~9将元素进行归类。
第二次分类,选取元素的十位数,按0~9将元素进行归类。
第三次分类,选取元素的百位数,按0~9将元素进行归类。
2.示例代码 对一个长度为N的序列从小到大进行排序,序列中元素的不为0的最高位为第i位,从第1位开始,将0~9存放到二维数组的第一维,再将序列中当前位的元素与第一维对应,存放到二维数组的第二维,按该存放方式到元素的最高位为止。
public class RadixSort {public static void main(String[] args) {
int[] array = { 19, 82, 137, 22, 5, 431, 23, 20, 11, 109 };
RadixSort.sort(array);
System.out.println("排序后数组:" + Arrays.toString(array));
}public static void sort(int[] a) {
int digit = 0;
// 数组的最大位数
for (int i : a) {
// 获取数组中数的最大位数
digit = Math.max(digit, String.valueOf(i).length());
}
int k = 0;
// 用户记录排序数组的索引
int m = 1;
// 当前的位数,个位用1表示,十位用2表示,以此类推
int n = 1;
// 用来表示当前位数的整数倍
int type = 10;
// 将余数从0-9分为10种类型
int[][] temp = new int[type][a.length];
// 第一维用来存储余数,第二维用来存储余数对应的数组值
int[] order = new int[type];
// 用户第二维数组值得索引计数
while (m <= digit) {
// 遍历数组中的每个元素,以当前位数依据余数进行归类
for (int i = 0;
i < a.length;
i++) {
int r = (a[i] / n) % 10;
// 当前数值在当前位数的余数
temp[r][order[r]] = a[i];
// 第一次为temp[r][0],第二次为temp[r][1]......
order[r]++;
}
// 遍历二维数组的第一维
for (int i = 0;
i < type;
i++) {
if (order[i] != 0) {// 当order[i]==0时,说明order[r]++没有执行,temp[r][]中没有存储数组值
// 遍历二维数组的第二维
for (int j = 0;
j < order[i];
j++) {// order[i]表示当前i余数的类型存储的数组值的个数
a[k] = temp[i][j];
k++;
}
}
order[i] = 0;
}
k = 0;
// 排序数组索引初始化
m++;
// 当前位数个数的索引
n *= 10;
// 当前位数向前推
}
}}
3.算法分析 【基本排序_基数排序_Java实现】时间复杂度:
待排序列有n个元素,所有元素的最大位数为d(如最大位数为百分位,则d=3),r为当前位数的取值范围(如0~9),基数排序的时间复杂度为O(d(n+r))。
算法稳定性:
在基数排序中,当前位数相同的数值不会交换位置,所以基数排序是稳定的排序算法。
推荐阅读
- 做一件事情的基本原理是什么()
- dubbo基本认识
- 一个选择排序算法
- HTML基础--基本概念--跟着李南江学编程
- 排序(归并排序)
- 7、前端--jQuery简介、基本选择器、基本筛选器、属性选择器、表单选择器、筛选器方法、节点操作、绑定事件
- 【图解】9张图彻底搞懂堆排序
- 一般模型化关系——从模型是什么到如何起作用的基本答案
- canvas(一)基本用法
- 带你了解类型系统以及flow和typescript的基本使用