排序算法-基數排序(Java)

基數排序

  1. 基數排序屬於“分配式排序”,又稱“桶子法”,就是通過鍵值的各個位的值,將排序的元素分配至某些“桶中”,達到排序的目的
  2. 基數排序屬於穩定性排序,基數排序是效率高的穩定性排序法
  3. 基數排序是穩定性排序的擴展
  4. 基數排序是1887年赫爾曼·何樂禮發明的。它是這樣實現的:將整數按照位數切割成不同的數字,然後按每個位數分別比較

基數排序的基本思想

  1. 將所有待比較數值統爲同樣的數位長度,數位較短的數前面補零。然後,從最低位來時,依次進行一次排序。這樣從低位排序一直到最高位排序完成以後,數列就變成一個有序序列
  2. 這樣說明,比較難理解,下面我們看一個圖文解釋,理解基數排序的步驟

在這裏插入圖片描述
在這裏插入圖片描述
基數排序代碼實現

	public static void radixSort(int [] arr){
		int max = arr[0];//假設第一個數就是最大值
		for(int i = 1;i < arr.length; i++){
			if(arr[i] > max){
				max = arr[i];
			}
		}
		//最大數是幾位數
		int maxLength = String.valueOf(max).length();
		//定義二維數組模擬10個桶,每個桶就是一維數組
		int [] [] bucket = new int [10] [arr.length];
		//定義一維數組記錄進入桶中元素的數量
		int [] bucketElementCounts = new int [10];
		//接下來循環處理-循環的次數便是最大數的位數(n用於處理獲取個位十位百位等數字)
		for(int i = 0,n = 1;i < maxLength;i++,n*10){
			for(int j = 0;j < arr.length;j++){
				//取出每一個元素對應的值
				int digitOfElement = arr[j] / n % 10;
				//放入對應的桶中
				bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
				bucketElementCounts[digitOfElement]++;
			}
			//按照這個桶的順序(一維數組的下標,依次取出數據,再放回原數組)
			int index = 0;
			for(int k = 0;k < bucketElementCounts.legth;k++){
				if(bucketElementCounts[k] != 0){
					for(int l = 0;l < bucketElementCounts[k];l++){
						arr[index++] = bucket[k][l];
					}
				}
				bucketElementCounts[k] = 0;//需要清零便於下次循環裏面沒有髒數據
			}
		}
	}

基數排序的說明

  1. 基數排序是對傳統桶排序的擴展,速度很快
  2. 基數排序是空間換時間的方式,佔內存很大
  3. 基數排序時穩定
  4. 有負數時候需要參考其他文章

排序算法比較圖
在這裏插入圖片描述

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