基数排序之代码优化

很久之前写过关于基于基数排序的代码实现。那时候还年轻不懂事,最近无意中与同事聊起,把百度基数排序看了一遍,又想起之前敲过的代码,回头翻出来看了一遍,发现还很粗糙,完全不能看的节奏。

 我以前敲代码用到链表,发现还不错,就想着用链表去实现一遍。好久没用链表了,都有点忘了,花了些时间是把思维理清。链表LinkList采用的是双端链表,从链表的尾部添加,头部拿出来,每拿出一个就去掉一个Link(这是为了保存数据的稳定性)。

public class RadixSort {
	private static LinkList[] linkList= new LinkList[10];
	static{
		for(int i = 0 ; i < 10 ; i++){
			linkList[i] = new LinkList();
		}
	}
	
	public static void clear(){
		for(int i = 0 ; i < 10 ; i++){
			linkList[i].clear();
		}
	}
	
	/** 与百度基数排序一致的想法实现*/
	public static void sort(int[] number,int q) 
	{	
		int num = number.length;
		int d = 1; 
		int t = 0;
		int temp;
		while(q > 0){
			for(int i = 0 ; i < num ; i++){
			    temp = (number[i]/d) % 10;
					linkList[temp].insertLast(number[i]);
			}
			for(int k = 0 ; k < 10 ; k++){
				while((temp = linkList[k].popFirst())!= -1){
					number[t++] = temp;
				}			
			}
			t = 0;
			d = d*10;
			q--;
		}
		clear();
	}
}public static void sort(int[] number ){
		 int len = number.length;
		 int[] sorted = new int[len];//已排好序的数组
		 int num = len;//还剩多少要排序的,动态变
		 int d = 1; //位
		 int temp;
		 int num1 = num;//每一轮要排序的长度
		 int t ;
		 while(num1 > 0 ){
			 for(int i = 0 ; i < num1 ; i++){
				 temp = number[i] / d;
				 if(temp == 0){
					 sorted[len - num] = number[i];
					 num --;
				 }else{
					 temp = temp % 10;
					 linkList[temp].insertLast(number[i]);
				 }
			 }
			 num1 = num;
			 t = 0;
			 for(int k = 0 ; k < 10 ; k++){
					while((temp = linkList[k].popFirst())!= -1){
						number[t++] = temp;
					}			
			}
			d = d * 10;		
		 }
		clear();		
		//number = sorted;这样子是不行的
		for(int i = 0 ; i < len ; i++){
			number[i] = sorted[i];
		}		
	}/**
	 *  不知道位数的基数排序
	 */
	public static void sort(int[] number ){
		 int len = number.length;//数组长度
		 int num = 0 ;//已排好序的个数
		 int d = 1; //位
		 int temp; //临时变量,看环境而变
		 int t ; //临时变量,看环境而变
		 while(num < len ){
			 for(int i = num ; i < len ; i++){
				 temp = number[i] / d;
				 if(temp == 0){
					 number[num++] = number[i];
				 }else{
					 temp = temp % 10;
					 linkList[temp].insertLast(number[i]);
				 }
			 }
			 t = num;
			 for(int k = 0 ; k < 10 ; k++){
					while((temp = linkList[k].popFirst())!= -1){
						number[t++] = temp;
					}			
			}
			d = d * 10;		
		 }
		clear();				
	}/** 
	 * 已知道位数的基数排序
	 */
	public static void sort(int[] number,int maxd ){
		 int len = number.length;//数组的长度
		 int num = 0 ;//已排好序的个数
		 int d = 1; //位
		 int temp; //临时变量,看环境
		 int temp1 ;//临时变量,看环境
		for(int j = 0 ; j < maxd; j++){
			 for(int i = num ; i < len ; i++){
				 temp = number[i] / d;
				 if(temp == 0){ //已经没有更多位了
					 number[num++] = number[i];
				 }else{
					 temp = temp % 10;
					 linkList[temp].insertLast(number[i]);
				 }
			 }
			 temp1 = num;
			 for(int k = 0 ; k < 10 ; k++){
					while((temp = linkList[k].popFirst())!= -1){
						number[temp1++] = temp;
					}			
			 }
			d = d * 10;		
		 }
		clear();				
	}public static int getRadix(int[] number){
		int temp = number[0];
		int index = 0;//位数
		/** 查出最大的数 */
		for(int i = 1 ; i < number.length ; i++){
			if(temp < number[i]){
				temp = number[i];
			}
		}
		do{
			index++;
			temp /= 10;
		}while(temp > 0);
		
		return index;
	}public class Link {
	public int idata;
	public Link next = null;
	public Link(int idata){
		this.idata = idata;
	}
}
/** 采用在尾部last添加,从头部first拿出*/
public class LinkList {
	public Link first = null;
	public Link last = null;
	
	public LinkList(){}
	
	public void insertLast(int idata){
		Link link = new Link(idata);
		if(last == null){
			first =  link;
		}else{
			last.next = link;
		}	
		last = link;		
	}
	
	/**如果没有数则返回-1 */
	public int popFirst(){		
		if(first != null){
			if(last == first){
				last = null;
			}
			int temp = first.idata;
			first = first.next;
			return temp;
		}
		return -1;
	}
	
	public void clear(){
		first = null;
		last = null;
	}
	
	public void print(){
		Link temp = first;
		while(temp!= null){
			System.out.print(temp.idata +  "  ");
			temp = temp.next;
		}
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值