算法基础之排序篇-基数排序
2012-08-14 10:33
274 查看
1、算法描述
基数排序是根据不同位的信息将待排数据放入到特定的一些桶中,以达到排序的目的。基数排序可分为LSD和MSD。LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。
操作步骤(以LSD为例)
(1)、设定10个桶,记为0-9
(2)、如果数据有小数点的话,保持数值不变,在最右边加0以保持小数点后位数一致。
(3)、循环待排数据,取数据的最右边位(记为i=1),将数据放入标记等于其个位的桶里面。
(4)、依次从0-9个桶里面取数据,形成新的序列,i=i+1
(5)、将新的序列按右边第i位为键值分别放入对应的桶内
(6)、重复(4)(5),直到所有数据都排到了最左位(即i=max(数据位数))
2、图例
3、代码
public void sort(int[] data) { int k = 0; int n = 1; int m = 1; int max = 0; int tempmax = 0; for (int i = 0; i < data.length; i++) { tempmax = data[i] > 0 ? (int) Math.log10(data[i]) : 0; max = max < tempmax ? tempmax : max; } max = max + 1; int[][] temp = new int[data.length][data.length]; int[] num = new int[data.length]; while (m <= max) { for (int i = 0; i < data.length; i++) { int q = ((data[i] / n) % 10); temp[q][num[q]] = data[i]; num[q]++; } for (int i = 0; i < temp.length; i++) { if (num[i] != 0) { for (int j = 0; j < num[i]; j++) { data[k] = temp[i][j]; k++; } } num[i] = 0; } n *= 10; k = 0; m++; } }
4、稳定性及复杂度
稳定性:基数排序是稳定的排序
平均时间复杂度:O(nk)
空间复杂度:O(nk)
相关文章推荐
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- 基础算法--排序: 之插入排序
- C++——算法基础之排序——快速排序
- 算法基础:排序(四)——二叉堆、优先队列、堆排序——Python实现
- 基础算法学习之排序篇(js实现)
- 排序基础算法汇总-java实现
- c语言基础算法(一)---排序
- 算法-蓝桥杯-基础练习 数列排序(JAVA)
- 基础算法(二):堆排序,快速排序
- php四种基础排序(基础算法)----②选择排序法
- 算法基础(三)——排序 .
- C++基础算法练习之排序比较
- 基础算法 :冒泡排序,选择排序。。。。
- 基础排序算法之快速排序(Quick Sort)
- 算法-排序-归并排序和基数排序(排序总结)
- 【基础算法】排序-复杂排序之二(找出第K大的数)
- 常见排序算法之计数排序与基数排序
- 基础算法之快速排序
- 【算法导论】C++参考源码之基础排序
- 算法基础之排序篇-堆排序