經常使用排序算法(十)——基數排序

        基數排序又是一種和前面排序方式不一樣的排序方式,基數排序不須要進行記錄關鍵字之間的比較。基數排序是一種藉助多關鍵字排序思想對單邏輯關鍵字進行排序的方法。所謂的多關鍵字排序就是有多個優先級不一樣的關鍵字。好比說成績的排序,若是兩我的總分相同,則語文高的排在前面,語文成績也相同則數學高的排在前面。。。若是對數字進行排序,那麼個位、十位、百位就是不一樣優先級的關鍵字,若是要進行升序排序,那麼個位、十位、百位優先級一次增長。基數排序是經過屢次的收分配和收集來實現的,關鍵字優先級低的先進行分配和收集。 數組

        舉個栗子:
圖片描述code

圖片描述

       實現代碼:
orm

public class RadixSort { 
	public static void radixSort(int[] arr) { 
		if(arr == null & arr.length == 0) 
			return ; 
		
		int maxBit = getMaxBit(arr); 
		
		for(int i=1; i) { 
			List> buf = distribute(arr, i); //分配 
			collecte(arr, buf); //收集 
		} 
	} 
	
	/** 
	* 分配 
	* @param arr 待分配數組 
	* @param iBit 要分配第幾位 
	* @return 
	*/ 
	public static List> distribute(int[] arr, int iBit) { 
		List> buf = new ArrayList>(); 
		
		for(int j=0; j) { 
			buf.add(new LinkedList()); 
		} 
		
		for(int i=0; i) { 
			buf.get(getNBit(arr[i], iBit)).add(arr[i]); 
		} 
		
		return buf; 
	} 
			
	/** 
	* 收集 
	* @param arr 把分配的數據收集到arr中 
	* @param buf 
	*/ 
	public static void collecte(int[] arr, List> buf) { 
		int k = 0; 
		for(List bucket : buf) { 
			for(int ele : bucket) { 
				arr[k++] = ele; 
			} 
		} 
	} 
	
	/** 
	* 獲取最大位數 
	* @param x 
	* @return 
	*/ 
	public static int getMaxBit(int[] arr) { 
		int max = Integer.MIN_VALUE; 
		for(int ele : arr) { 
			int len = (ele+"").length(); 
			if(len > max) 
				max = len; 
		} 
		return max; 
	} 
	
	/** 
	* 獲取x的第n位,若是沒有則爲0. 
	* @param x 
	* @param n 
	* @return 
	*/ 
	public static int getNBit(int x, int n) { 
		
		String sx = x + ""; 
		if(sx.length() n) 
			return 0; 
		else 
			return sx.charAt(sx.length()-n) - '0'; 
	} 
}
相關文章
相關標籤/搜索