1. 程式人生 > >八大排序之堆排序--基數排序 java

八大排序之堆排序--基數排序 java

八大排序之堆排序–基數排序 java

演算法過程: 1、初始化:構造一個10*n的二維陣列,一個長度為n的陣列用於儲存每次位排序時每個桶子裡有多少個元素。 2、迴圈操作:從低位開始(我們採用LSD的方式),將所有元素對應該位的數字存到相應的桶子裡去(對應二維陣列的那一列)。然後將所有桶子裡的元素按照桶子標號從小到大取出,對於同一個桶子裡的元素,先放進去的先取出,後放進去的後取出(保證排序穩定性)。這樣原陣列就按該位排序完畢了,繼續下一位操作,直到最高位排序完成。

程式碼: import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String[] st = sc.nextLine().split(",");
		int[] arr = new int[st.length];
		for (int i = 0; i < arr.length; i++) {
			arr[i] = Integer.parseInt(st[i]);
		}
		radixSort(arr);
		for (int num : arr) {
			System.out.print(num + " ");
		}
	}

	public static void radixSort(int[] arr) {
		// 指數 -- 當對陣列按各位進行排序時,exp=1;按十位進行排序時,exp=10;...
		int exp;
		// 陣列a中的最大值
		int max = getMax(arr);
		// 從個位開始,對陣列a按"指數"進行排序
		for (exp = 1; max / exp > 0; exp *= 10) {
			countSort(arr, exp);
		}
	}

	public static int getMax(int[] arr) {
		int max;
		max = arr[0];
		for (int i = 1; i < arr.length; i++) {
			if (max < arr[i]) {
				max = arr[i];
			}
		}
		return max;
	}

	public static void countSort(int[] arr, int exp) {
		// 儲存"被排序資料"的臨時陣列
		int[] output = new int[arr.length];
		int[] buckets = new int[10];
		// 將資料出現的次數儲存在buckets[]中
		for (int i = 0; i < arr.length; i++) {
			buckets[(arr[i] / exp) % 10]++;
		}
		// 更改buckets[i]。目的是讓更改後的buckets[i]的值,是該資料在output[]中的位置。
		for (int i = 1; i < 10; i++) {
			buckets[i] += buckets[i - 1];
		}
		// 將資料儲存到臨時陣列output[]中
		for (int i = arr.length - 1; i >= 0; i--) {
			output[buckets[(arr[i] / exp) % 10] - 1] = arr[i];
			buckets[(arr[i] / exp) % 10]--;
		}
		// 將排序好的資料賦值給arr[]
		for (int i = 0; i < arr.length; i++) {
			arr[i] = output[i];
		}
		output = null;
		buckets = null;
	}
}