基于JAVA的排序算法之九--基数排序

本文详细介绍了Java中基数排序算法的实现,包括从低位到高位的循环、位计数器的使用以及排序过程中的临时数组操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

九、基数排序

java代码实现:

 

01.   

04.import java.util.Arrays;    

05.public class RadixSort {      

06.     

07.         

13.    public int digit(long x, long d) {      

14.     

15.        long pow = 1;      

16.        while (--d > 0) {      

17.            pow *= 10;      

18.            

19.        return (int) (x / pow % 10);      

20.        

21.     

22.         

30.    public long[] radixSortAsc(long[] arr) {      

31.        //从低位往高位循环      

32.        for (int d = 1; d <= getMax(arr); d++) {      

33.            //临时数组,用来存放排序过程中的数据      

34.            long[] tmpArray = new long[arr.length];      

35.            //位记数器,从第0个元素到第9个元素依次用来记录当前比较位是0的有多少个..是9的有多少个数      

36.            int[] count = new int[10];      

37.            //开始统计0有多少个,并存储在第0位,再统计1有多少个,并存储在第1位..依次统计到9有多少个      

38.            for (int i = 0; i < arr.length; i++) {      

39.                count[digit(arr[i], d)] += 1;      

40.                

41.                 

48.            for (int i = 1; i < 10; i++) {      

49.                count[i] += count[i - 1];      

50.                

51.     

52.                 

62.            for (int i = arr.length - 1; i >= 0; i--) {//只能从最后一个元素往前处理      

63.                //for (int i = 0; i < arr.length; i++) {//不能从第一个元素开始循环      

64.                tmpArray[count[digit(arr[i], d)] - 1] = arr[i];      

65.                count[digit(arr[i], d)]--;      

66.                

67.     

68.            System.arraycopy(tmpArray, 0, arr, 0, tmpArray.length);      

69.            

70.        return arr;      

71.        

72.     

73.         

80.    public long[] radixSortDesc(long[] arr) {      

81.        for (int d = 1; d <= getMax(arr); d++) {       

82.            long[] tmpArray = new long[arr.length];      

83.            //位记数器,从第0个元素到第9个元素依次用来记录当前比较位是9的有多少个..是0的有多少个数      

84.            int[] count = new int[10];      

85.            //开始统计0有多少个,并存储在第9位,再统计1有多少个,并存储在第8位..依次统计      

86.            //到9有多少个,并存储在第0位      

87.            for (int i = 0; i < arr.length; i++) {      

88.                count[9 - digit(arr[i], d)] += 1;      

89.                

90.     

91.            for (int i = 1; i < 10; i++) {      

92.                count[i] += count[i - 1];      

93.                

94.     

95.            for (int i = arr.length - 1; i >= 0; i--) {      

96.                tmpArray[count[9 - digit(arr[i], d)] - 1] = arr[i];      

97.                count[9 - digit(arr[i], d)]--;      

98.                

99.     

100.            System.arraycopy(tmpArray, 0, arr, 0, tmpArray.length);      

101.            

102.        return arr;      

103.        

104.     

105.    private int getMax(long[] array) {      

106.        int maxlIndex = 0;      

107.        for (int j = 1; j < array.length; j++) {      

108.            if (array[j] > array[maxlIndex]) {      

109.                maxlIndex = j;      

110.                 

111.            

112.        return String.valueOf(array[maxlIndex]).length();      

113.        

114.     

115.    public static void main(String[] args) {      

116.        long[] ary = new long[] { 123, 321, 132, 212, 213, 312, 21, 223 };      

117.        RadixSort rs = new RadixSort();      

118.        System.out.println("升- " + Arrays.toString(rs.radixSortAsc(ary)));      

119.     

120.        ary = new long[] { 123, 321, 132, 212, 213, 312, 21, 223 };      

121.        System.out.println("降- " + Arrays.toString(rs.radixSortDesc(ary)));      

122.        

123.}     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值