基数排序

来源:互联网 发布:碳纤维规格知乎 编辑:程序博客网 时间:2024/04/30 05:00

箱排序:也称桶排序。

基本思想:设置多[k]个箱,依次把a[1],a[2],a[3]…..a[n]按其键值为k放入k个箱中,依次按1-kk个箱首尾相连。这样就排好序了。

例如:把一副52张牌按照点数排序,可以设置13个箱依次表示为1-13,把点数为A的放到1号箱,点数为2-10的分别放入2-10号箱,把JQK分别放入11-13号箱,这样依次连接1-13号箱,就排好序了。

基数排序:

基数排序的特征:基数排序的每一个键都由d个分量组成ki1,ki2,ki3…ki(d-1),d个分量每个分量代表一个独立的关键字。如:扑克牌中的点数和花色。

排序思想:从低位到高位依次对kj(j=d-1d-20)进行箱排序。在d趟箱排序中,所需的箱子数就是基数rd,这就是"基数排序"名称的由来。

 

例子:排序下列数73, 22, 93, 43, 55, 14, 28, 65, 39, 81

按个位分别把需要排序的数放到0-9的桶中。

0

1

2

3

4

5

6

7

8

9

 

81

22

73

14

55

 

 

28

39

 

 

 

93

 

65

 

 

 

 

接着把这些桶中的数值按照桶的顺序串起来,如:81, 22, 73, 93, 43, 14, 55, 65, 28, 39

按十位分别数放到0-9的桶中,如:

0

1

2

3

4

5

6

7

8

9

 

14

22

39

43

55

65

73

81

93

 

 

28

 

 

 

 

 

 

 

接着把这些桶中的数值按照桶的顺序串起来,如:14, 22, 28, 39, 43, 55, 65, 73, 81, 93

这样就排好序了。

代码实现:

    public static void sort(int[] number, int d) {

       int k = 0;

       int n = 1;

       int m = 1;

       int[][] temp = new int[number.length][number.length];

       int[] order = new int[number.length];

       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 < d; 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++;

       }

    }

原创粉丝点击