20、基數排序

  • 思想:
用空間換時間,他用一個二維數組(10*n)和一位數組(1*10),用於排序的道具,該排序不是依據的傳統的比較的思想,她是採用,先讓所有元素按照個位的數字,放在二維數組中(二維數組中,第一維:個位、十位、百位...,第二位用於盛放數據:一個數據、兩個數據...),然後以爲數組記錄每個個位數組裏數據的數量,然後再將二維數組中的數據,依據從小到大的順序拿出來,這個新組成的數據,就是第一輪排序後的結果。
以此類推,完成十位、百位的排序...
  • 代碼:
package Sort;

import java.util.Arrays;

public class RadixSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = {34,12,890,443,789,32,18,90};
		RadixSort radixSort = new RadixSort();
		radixSort.Radix(arr);
		System.out.println(Arrays.toString(arr));

	}
	
	
	//基數排序:用空間換時間
	//思路:
	//1、首先找到數組中元素位數最多的那一位,看看他有幾位組成,就遍歷幾次
	//2、生成一個10*n的二維數組,大小和arr.length一樣。在生成個一維數組,用於記錄每個每個桶裏有幾個元素
	//3、開始遍歷,先從各個元素的個位開始遍歷,從小到大放在數組中,放入後,在依次取出來,這就完成了一次遍歷
	//4、然後繼續遍歷,直到遍歷完。
	
	public void Radix(int[] arr) {
		if(arr.length == 0) {
			return;
		}
		//定義一個二維數組,用於存放數組
		int[][] arr2 = new int[10][arr.length];
		//定義一個一維數組,用於計數
		int[] arr1 = new int[10];
		
		
		int max = 0;//最大元素
		for(int i = 0; i < arr.length; i++) {
			if(max < arr[i]) {
				max = arr[i];
			}
		}
		//看最大元素有幾位數組成
		max = (max +"").length();//比如345,那麼max = 3
		int temp;
		int index;
		
		//遍歷max次,
		for(int i = 0 ,n = 1; i < max; i++ , n *= 10) {
			//n:用於取個位、十位、百位...放入arr2中
			for(int j = 0; j < arr.length; j++) { 
				temp = arr[j] / n % 10;
				arr2[temp][arr1[temp]++] = arr[j];			
			}
			index = 0;
			//將arr2元素取出來,重新合在一起
		
			for(int k = 0; k < 10; k++) {
				if(arr1[k] != 0) {
					for(int m = 0;m < arr1[k]; m++) {
						arr[index++] = arr2[k][m];
					}
				}	
				arr1[k] = 0;
			}
			
		}		
	}
	

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