Java提高 - 八大排序方法之基数排序

来源:互联网 发布:js if判断不等于1或2 编辑:程序博客网 时间:2024/05/17 22:42

基数排序

原理:将数字按位数划分出n个关键字,每次针对一个关键字进行排序,然后针对排序后的序列进行下一个关键字的排序,循环至所有关键字都使用过则排序完成。好像很难理解是吧,这里举个例子就容易多了,你可以先创建十个数组,第一个数组放个位数0的、第二个数组放个位数是1的,依次类推。然后把他们重新排列下来,清空数组。接下来第一个数组放十位数为0的、第二个放十位数为1的,依次类推,然后把他们重新排列下来,清空数组。

假设数组为:73, 22, 93, 43, 55, 14, 28,65, 39, 81

第一次分组为:

[0][]

[1][81]

[2][22]

[3][73,93,43]

[4][14]

[5][55,65]

[6][]

[7][]

[8][28]

[9][39]

重新排列为:81, 22, 73, 93, 43, 14, 55,65, 28, 39

第二次分组为:

[0][]

[1][14]

[2][22,28]

[3][39]

[4][43]

[5][55]

[6][65]

[7][73]

[8][81]

[9][93]

重新排列为:14, 22, 28, 39, 43, 55, 65,73, 81, 93

这里第一次排序会把各位数比较大的放到后面,这样会使十位数相同的数组个位数大的一定在后面,同理重排序十位数便可重新排列顺序。

要点:对关键字的选取,元素分配收集。

实现:

/** * 基数排序 * @param number * @param d 表示最大的数有多少位 */public static void RadixSort(int[] number, int d) { // d表示最大的数有多少位int k = 0;int n = 1;int m = 1; // 控制键值排序依据在哪一位int[][] temp = new int[10][number.length]; // 数组的第一维表示可能的余数0-9int[] order = new int[10]; // 数组orderp[i]用来表示该位是i的数的个数while (m <= d) {for (int i = 0; i < number.length; i++) {int lsd = ((number[i] / n) % 10);temp[lsd][order[lsd]] = number[i];order[lsd]++;}for (int i = 0; i < 10; i++) {if (order[i] != 0)for (int j = 0; j < order[i]; j++) {number[k] = temp[i][j];k++;}order[i] = 0;}n *= 10;k = 0;m++;}}

0 0
原创粉丝点击