1. 程式人生 > >排序演算法之(二)選擇排序

排序演算法之(二)選擇排序

原理:
每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到全部待排序的資料元素排完。
選擇排序是不穩定的排序方法。
思路:

  1. n個數進行n-1次排序
  2. 每一次排序都在剩餘的元素中找到最小(最大)的元素
  3. 排好的元素就不帶他玩了

舉例說明:
排序陣列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的相對位置前後順序就破壞了)。