基数排序-java实现

基数排序:

       

       像选择排序、插入排序、快速排序等都是基于两个元素的比较进行排序的。而基数排序无需进行元素比较,基于队列处理就能够达到排序的目的。


        基数排序不是基于排序关键字来比较排序项,而是基于排序关键字的结构。对于排序关键字中的每一个数字或字符的每一种可能取值,都会创建一个单独的队列。队列的数目就称为基数。


例如:要排序全部由小写字母组成的字符串,则基数就是26,就会用到26个单独的队列。如果对十进制数进行排序,则基数应该是10.


时间复杂度分析:

        在基数排序中,没有任何元素的比较和交换,元素只是在每一轮中从一个队列移动到另一个队列。对于给定的基数,遍历数据的轮次是一个常数,它与排序关键字的数目无关,于是,基数排序算法的时间复杂度为O(n).

为什么不是所有的排序都使用基数排序算法呢?

1.基数排序算法要根据给定问题特别设计;
2.如果排序关键字中的数字数目与列表中元素的数目接近,那么算法的时间复杂度接近O(n平方);
3.基数影响空间复杂度。


Code:

/*
*Created on 2016年7月12日
*Copyright 2016 Yong Cai Limited crop. All Rights Reserved
*
*/

package org.cy.sort;

import java.util.LinkedList;
import java.util.Queue;

public class RadixSort {

	public static void main(String[] args) {
		int[] data = {1112,7839,2345,6666,6766,1113,9909,1000};
		
		String tmp;
		int numObj;
		int digit,num;
		Queue<Integer>[] digitQueue = (LinkedList<Integer>[])(new  LinkedList[10]);
		
		for(int digitVal = 0; digitVal <= 9; digitVal++){
			digitQueue[digitVal] = (Queue<Integer>)(new LinkedList<Integer>());
		}
		
		//sort
		for(int pos = 0; pos <= 3; pos++){
			for(int scan = 0; scan < data.length; scan++){
				tmp = String.valueOf(data[scan]);
				digit = Character.digit(tmp.charAt((3 - pos)), 10);
				digitQueue[digit].add(new Integer(data[scan]));
			}
			
			num = 0;
			for(int digitVal = 0; digitVal <= 9; digitVal++){
				while(!(digitQueue[digitVal]).isEmpty()){
					numObj = digitQueue[digitVal].remove();
					data[num] = numObj;
					num++;
				}
			}
		}
		
		for(int scan = 0; scan < data.length; scan++){
			System.out.print(data[scan] + " ");
		}
	}

}

res:

1000 1112 1113 2345 6666 6766 7839 9909





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值