排序算法之基数排序

基数排序(redix sort)又称桶子法,是一个稳定的排序算法。就像有0到9共10个桶子,根据个位、十位、百位...数字来存放这些数据,近而进行排序。

假设有这么一组数据a{15, 7, 26, 43, 13, 72, 10, 31, 17}需要排序。思路如下:

①首先按照个数数大小来放在桶子里。

0:10

1:31

2:72

3:43, 13

4:

5:15

6:26

7:7, 17

8:

9:

②得到的排序结果是:10, 31, 72, 43, 13, 15, 26, 7, 17,然后在按照十位数的大小放进桶子里

0:7

1:10, 13, 15, 17

2:26

3:

4:43

5:

6:

7:72

8:

9:

③最终得到的排序结果是 7, 10, 13, 15, 17, 26, 43, 72

java代码如下:

<span style="white-space:pre">	</span>/**
	 * @param data 待排序数组
	 * @param temp 临时数组,数组长度等于data的长度
	 * @param x 用来控制比较的位数
	 */
	public static void baseSort(int[] data, int[] temp, int x) {
		boolean bool = false;//用来控制递归是否跳出
		for (int i = 0; i < data.length; i++) {
			if (data[i] / x > 0) {
				bool = true;
			}
		}
		
		if (bool) {
			int k = 0;
			for (int j = 0; j < 10; j++) {//桶子,按顺序遍历桶子
				for (int i = 0; i < data.length; i++) {//遍历数组
					if((data[i] / x) % 10 == j) {//除以x然后在对10求余,得到他需要放的桶子
						temp[k++] = data[i];//根据桶子0-9按顺序放入temp数组中
					}
				}
			}

			//将排序完了的数组放入data中
			for (int i = 0; i < temp.length; i++) {
				data[i] = temp[i];
			}
			
			print(data);//打印数组
			
			baseSort(data, temp, x*10);//往上一位排序,例如先排的个位,接下来就是十位了
		}
	}

<span style="white-space:pre">	</span>public static void print(int[] data) {
		for (int i = 0; i < data.length; i++) {
			System.out.print(data[i] + "  ");
		}
		System.out.println();
	}

在上面代码排序中是不能有负数的,如果有负数便不能直接调用上面的代码,需调用以下代码,不过这样之后便变得不稳定了:

<span style="font-size:18px;"><span style="white-space:pre">	</span>public static void base(int[] data){
		int m = 0;
		int n = 0;
		int k = 0;
		int j = 0;
		int index = 0;
		
		for (int i = 0; i < data.length; i++) {
			if(data[i] > 0){
				m++;
			} else {
				n++;
			}
		}

		int[] data1 = new int[m];
		int[] data2 = new int[n];
		int[] temp1 = new int[m];
		int[] temp2 = new int[n];
		
		for (int i = 0; i < data.length; i++) {
			if(data[i] > 0){
				data1[k++] = data[i];
			} else {
				data2[j++] = -data[i];
			}
		}
		
		baseSort(data1, temp1, 1);
		baseSort(data2, temp2, 1);
		
		if(m > 0){
			for (int i = data2.length -1; i >= 0; i--) {
				data[index++] = -data2[i];
			}
		}
		
		if(n > 0){
			for (int i = 0; i < data1.length; i++) {
				data[index++] = data1[i];
			}
		}
		
		print(data);
	}</span>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值