排序演算法之(二)選擇排序
阿新 • • 發佈:2018-12-12
原理:
每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到全部待排序的資料元素排完。
選擇排序是不穩定的排序方法。
思路:
- n個數進行n-1次排序
- 每一次排序都在剩餘的元素中找到最小(最大)的元素
- 排好的元素就不帶他玩了
舉例說明:
排序陣列int[] arr={6,3,8,2,9,1};
第一次排序:找出最小元素為1,與6進行交換位置,{1,3,8,2,9,6}
第二次排序:找出最小元素為2,與3進行交換位置,{1,2,8,3,9,6}
第三次排序:找出最小元素為3,與8進行交換位置,{1,2,3,8,9,6}
第四次排序:找出最小元素為6,與8進行交換位置,{1,2,3,6,9,8}
第五次排序:找出最小元素為8,與9進行交換位置,{1,2,3,6,8,9}
java程式碼實現:
package com.learn.demo.sort; /** * 選擇排序 */ public class SelectionSort { public static void main(String[] args) { int[] arr={6,3,8,2,9,1};//6個數做5趟排序 System.out.print("交換之前:"); for(int num:arr){ System.out.print(num+" "); } System.out.println(); //選擇排序的優化 for(int i = 0; i < arr.length -1; i++) {// 做第i趟排序 i<5 int k = i; for(int j = k + 1; j < arr.length; j++){// 選最小的記錄 j<6 if(arr[j] < arr[k]){ k = j; //記下目前找到的最小值所在的位置 } } System.out.println("第"+(i+1)+"次查詢最小值為"+arr[k]); //在內層迴圈結束,也就是找到本輪迴圈的最小的數以後,再進行交換 if(i != k){ //交換a[i]和a[k] int temp = arr[i]; arr[i] = arr[k]; arr[k] = temp; } System.out.print("第"+(i+1)+"次交換時:"); for(int num:arr){ System.out.print(num+" "); } System.out.println(); } System.out.println(); System.out.print("交換後:"); for(int num:arr){ System.out.print(num+" "); } } }
demo執行後控制檯的輸出如下圖:
順序排序與氣泡排序的區別:
1.氣泡排序是比較相鄰位置的兩個數,而選擇排序是按順序比較,找最大值或者最小值;
2.氣泡排序每一輪比較後,位置不對都需要換位置,選擇排序每一輪比較都只需要換一次位置;
3.氣泡排序是通過數去找位置,選擇排序是給定位置去找數。
氣泡排序優缺點:
優點:比較簡單,空間複雜度較低,是穩定的
缺點:時間複雜度太高,效率慢
選擇排序優缺點:
優點:一輪比較只需要換一次位置
缺點:效率慢,不穩定(舉個例子5,8,5,2,9 我們知道第一遍選擇第一個元素5會和2交換,那麼原序列中2個5的相對位置前後順序就破壞了)。