極客時間-排序-基數排序(給100個手機號排序)

“基數排序對要排序的數據是有要求的,需要可以分割出獨立的“位”來比較,而且位之間有遞進的關係,如果 a 數據的高位比 b 數據大,那剩下的低位就不用比較了。除此之外,每一位的數據範圍不能太大,要可以用線性排序算法來排序,否則,基數排序的時間複雜度就無法做到 O(n) 了。”

package data.sort.line;

public class CardinalitySort {

	
	public static String[] countSort(String b[],int index) {
		int maxSize=Integer.parseInt(""+b[0].toCharArray()[index]);
		String c[]=new String[b.length];
		//1)找出數據中的最大數
		for(int i=1;i<b.length;i++) {
			if(Integer.parseInt(""+b[i].toCharArray()[index])>maxSize) {
				maxSize=Integer.parseInt(""+b[i].toCharArray()[index]);
			}
		}	
		
		//確定桶的數量,創建一個maxSize+1的桶數組,桶下標代表數值,桶中存放值代表重複數據的數量
		int bubble[]=new int[maxSize+1];
		//2)把值相等的數據放入到同一個桶中,統計每個桶的數量
		for(int j=0;j<b.length;j++) {
		    bubble[Integer.parseInt(""+b[j].toCharArray()[index])]++;
		}
		
		//把桶的數組順序求和,那麼這時候每個桶中的值就是包括桶下標在內的小於等於它的數量
		for(int i=1;i<bubble.length;i++) {
			bubble[i]=bubble[i-1]+bubble[i];
		}
		
		for(int k=b.length-1;k>=0;k--) {
			int i=Integer.parseInt(""+b[k].toCharArray()[index]);
			int realIndex=--bubble[i];
			c[realIndex]=b[k];
		}
		return c;
	}
	
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//給100萬的手機號排序,從低位到高位,按照穩定的方式給每位進行快速或計數或桶排序排序,這樣就能得到的複雜度就是11*o(n)
		//爲什麼要用穩定的方式,如果非穩定方式,那麼數的大小就取決於最後一次的最高位排序,這樣會導致低位的排序無序了,舉個列子 兩個手機號  
		//最高三位    137  132  比較完個位變成了132 137  這樣的順序原本是對的,比較十位 交換變成了137  132就反了,所以需要穩定排序(也就是需要從後向前循環數組)
		String a[]= {"14216658414","15216652418","13216658643","16216639416","17216658461","18214658413","19217458411","13814958415"};
		for(int j=10;j>=0;j--) {
			a=CardinalitySort.countSort(a,j);
		}
		
		for(int j=0;j<a.length;j++) {
			System.out.println(a[j]);
		}
		
		
	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章