1. 程式人生 > 實用技巧 >01.2-選擇排序

01.2-選擇排序

目錄


1、簡介

選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理如下:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序畢。

2、程式碼

public class SelectionSort {

    public static void sort(Comparable[] arr){

        int n = arr.length;
        for(int i = 0; i < arr.length; i++){

            int minIndex = i;
            for(int j = i+1; j < n; j++)

                if(less(arr[j], arr[minIndex]))
                    minIndex = j;

            swap(arr, i, minIndex);
        }
    }

    private static boolean less(Comparable a, Comparable b){
        return a.compareTo(b) < 0;
    }

    private static void swap(Comparable[] arr, int a, int b){

        Comparable temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }
}

3、測試

public static void main(String[] args) {
    // 測試Integer
    int n = 10000;
    Integer[] arr = SortTestHelper.generateRandomArray(n, 0, 10000);
    
    SelectionSort.sort(arr);
    SortTestHelper.printArray(arr);
    System.out.println();
    SortTestHelper.testSort("Ⅰ_sorting_basic.Ⅰ_selection_sort.SelectionSort", arr);
    
    // 測試自定義型別,類需要實現Comparable介面
}

4、複雜度分析

選擇排序的交換操作介於 0 和 (n - 1) 次之間。選擇排序的比較操作n(n - 1) / 2 次。選擇排序的賦值操作介於 03(n - 1) 次之間。所以總體上來說,時間複雜度為 O(n2)

比較次數 O(n2),比較次數與關鍵字的初始狀態無關,總的比較次數 N = (n -1) + (n - 2) + ... + 1
交換次數 O(n),最好情況是,已經有序,交換0次;最壞情況是,逆序,交換 n - 1 次。交換次數比氣泡排序較少,由於交換所需CPU時間比比較所需的CPU時間多,n 值較小時,選擇排序比氣泡排序快。

原地操作幾乎是選擇排序的唯一優點,當空間複雜度要求較高時,可以考慮選擇排序;實際適用的場合非常罕見。

複雜度
平均時間複雜度 О(n²)
最壞時間複雜度 О(n²)
最優時間複雜度 О(n²)
空間複雜度 總共О(n),需要輔助空間O(1)
最佳解 偶爾出現