選擇排序和冒泡排序同樣是基礎排序算法,現在也做個學習積累。
簡述
選擇排序算法較為穩定,基本上都是O(n2)的時間復雜度,規模越小排序越快,不需要占用額外空間。其實選擇排序原理很簡單,就是在未排序序列中找到最小(大)的元素然后放到數組前面,然后再從剩下的未排序序列中找到最小(大)的元素放在上一次找到最小(大)元素的后面,以此類推完成排序。
動圖演示
看下動圖上的演示,就能夠找出排序規律,非常之簡明易懂。
(算法動圖來源於參考資料,詳細請往下翻閱)
代碼實現
1 /** 2 * 選擇排序 3 * @param array 待排序數組 4 * @return 已排序數組 5 */ 6 public static int[] selectionSort(int[] array) { 7 int len = array.length; 8 // 如果數組長度為0或者1,都是不用排序直接返回 9 if(len == 0 || len == 1) { 10 return array; 11 } 12 for(int i = 0; i < len - 1; i++) { 13 int minIdx = i; 14 for(int j = i + 1; j < len; j++) { 15 // 找到最小的數 16 if(array[minIdx] > array[j]) { 17 // 保存最小數的索引 18 minIdx = j; 19 } 20 } 21 // 如果一輪比較下來都沒有變更最小值的索引則無需調換順序 22 if(minIdx != i) { 23 int tmp = array[i]; 24 array[i] = array[minIdx]; 25 array[minIdx] = tmp; 26 } 27 } 28 return array; 29 }
算法分析
最佳情況:T(n) = O(n2) 最差情況:T(n) = O(n2) 平均情況:T(n) = O(n2)
由此看出,選擇算法的排序情況是很穩定的,不管輸入什么樣的數據都是一樣的時間復雜度。
參考資料
1、https://www.cnblogs.com/guoyaohua/p/8600214.html