簡單選擇排序

Pluto372發表於2020-11-20

簡單選擇排序

選擇排序(Selection sort)是一種簡單直觀的排序演算法。

它的工作原理是:

1、第一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置。
2、然後再從剩餘的未排序元素中尋找到最小(大)元素,然後放到已排序的序列的末尾。
3、以此類推,直到全部待排序的資料元素的個數為零。

選擇排序是不穩定的排序方法。

需求:

排序前:{4,6,8,7,9,2,10,1}
排序後:{1,2,4,5,7,8,9,10}

畫圖分析:

在這裡插入圖片描述

第一次迴圈找到最小值1,和arr[0]交換
第二次迴圈找到最小值2,和arr[1]交換
第三次迴圈找到最小值4,和arr[2]交換

動畫演示:幫助理解選擇排序的思想

在這裡插入圖片描述

public class ChooseSort {
	public static void main(String[] args) {
		int[] arr = {4,6,8,7,9,2,10,1};
		System.out.println(Arrays.toString(arr));
		sort(arr);
		System.out.println(Arrays.toString(arr));
	}
	public static void sort(int[] arr){
	//外層迴圈比較輪數: 第一輪比較就可以最小的找出來,放在最前邊(交換)
		for(int i = 0;i<arr.length-1;i++) {
			//內層迴圈比較次數
			/*
			 * i+1是不和自己比較,找到最小值時前邊就不比較了
			 * 第一次輪比較4次,第二輪比較3次,依次遞減
			 */
			for(int j = i+1;j<arr.length;j++) {
				if(arr[j]<arr[i]) {
					int temp = arr[j];
					arr[j] = arr[i];
					arr[i] = temp;
				}
			}
		}
	}
}

執行結果:

在這裡插入圖片描述

時間複雜度:

選擇排序使用了雙層for迴圈,其中外層迴圈完成了資料交換,內層迴圈完成了資料比較,所以我們分別統計資料交換次數和資料比較次數:

資料比較次數:

(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2;

資料交換次數:

N-1
時間複雜度:N2/2-N/2+(N-1)=N2/2+N/2-1;

根據大O推導法則,保留最高階項,去除常數因子,時間複雜度為O(N^2);

穩點性:

選擇排序是給每個位置選擇當前元素最小的,比如給第一個位置選擇最小的,在剩餘元素裡面給第二個元素選擇第二小的,依次類推,直到第n-1個元素,第n個元素不用選擇了,因為只剩下它一個最大的元素了。那麼,在一趟選擇,如果一個元素比當前元素小,而該小的元素又出現在一個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。
舉個例子,序列5 8 5 2 9,我們知道第一遍選擇第1個元素5會和2交換,那麼原序列中兩個5的相對前後順序就被破壞了,所以選擇排序是一個不穩定的排序演算法

相關文章