Java 簡單選擇排序

喜歡把代碼講解寫在代碼註釋裏,方便大家邊看代碼邊看解釋。


簡單選擇排序是一種很簡單的排序,和冒泡有很多相似之處,比如兩層for循環 ;

但是時間複雜度太高了,最好最壞都是O(n^2)

上代碼:


/**
 * 簡單選擇排序是選擇類排序的一種
 * 
 * 基本思想:數組長度n,第一趟選擇排序,n個數中找到最小值,然後與第一個元素交換;
 * 第二趟選擇排序,範圍是從第二個元素到結尾,n-1個元素的範圍中尋找最小值和第二個元素交換,依次類推
 * 
 * 從這可以看出,這種算法移動數據的次數很少,每輪頂多一次,但是由於總的比較次數是:(n-1)+(n-2)+.....+2+1 = n*(n-1)/2
 * 即進行比較操作的時間複雜度是 :O(n^2)
 * 
 * 空間複雜度爲:O(1)
 * 
 * 最好情況是 :完全有序,則沒有移動的次數 ,時間複雜度爲 O(n^2)                                                                                                             
 * 最壞情況是: (這個需要想一會)第一個數據最大,其餘數據--從小到大--排列,此時移動次數最多,爲3*(n-1)
 * 時間複雜度爲  O(n^2)
 * 
 * 排序過程中需要進行比較的次數與初始狀態下待排序的數據排列情況無關
 */
public class Test {

	private static int data[]; // 數組方便測試,限定長度爲10

	/**
	 * 兩層循環和冒泡相似,第二層循環也是相似,只是冒泡每次比較中是交換過程,而選擇是循環結束,可能進行一次交換
	 */
	public static void Sort() {

		int temp; // 交換的介質, 定義在循環外,節省內存空間

		for (int i = 0; i < 9; i++) { // 第一層for ,循環n-1次
			int min = i; // 保存每一趟的最小的元素的下標
			for (int j = i + 1; j < 10; j++) { // i+1到9的範圍,即i後面到末尾的數據範圍
				if (data[j] < data[min]) {
					min = j;
				}
			}
			if (min != i) {   // min每輪循環初始值就是i 所以一旦被更改,即data[min]比data[i]小
				temp = data[i];
				data[i] = data[min];
				data[min] = temp;
			}
		}
	}

	/**
	 * 
	 * 輸出當前數組
	 */
	public static void PrintData() {
		for (int i = 0; i < 10; i++) {
			System.out.print(" " + data[i]);
		}
		System.out.println("");
	}

	public static void main(String[] args) {
		data = new int[10];
		Scanner scanner = new Scanner(System.in);
		System.out.println("輸入十個數字進行-簡單選擇排序-排序");
		for (int m = 0; m < 10; m++) {
			data[m] = scanner.nextInt();
		}
		Sort();
		PrintData();
		scanner.close();
	}

}


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