排序演算法之「選擇排序(SelectionSort) 」

ice_moss發表於2021-01-31

介紹

選擇排序是一種簡單直觀的排序演算法,無論什麼資料進去都是 O(n²) 的時間複雜度。所以用到它的時候,資料規模越小越好。唯一的好處可能就是不佔用額外的記憶體空間了吧。
選擇排序演算法是在一組數中有選擇的從大到小或者小到大進行排序,其邏輯是:

邏輯

在一組資料中從第一個數開始比較出該組資料中最小數,然後將其與第一個數互換位置,然後第二個數再依次從後面的數再進行比較,找出全陣列中第二小的數,再與第二個數互換位置,剩餘的數依次類推,即可得出陣列的排序。列如:

陣列{6,3, 5, 9, 4, 7, 8}

首先以[0 , 7)分別為上列陣列元素的索引

第一次比較以i = 0(就是6的索引)將6與{3, 5, 9, 4, 7, 8}中的元素進行比較(如:6大於3,則將比較索引1賦值給i,再將 i = 1的數與後面的數進行比較),找出的最小值為3,則將3與6位置互換,依次就完成了選擇排序演算法的整個邏輯。

程式碼實現

Golnag:

func SelectionSort(arr []int) []int {
    for i := 0; i < len(arr); i++ {
        tag := i
        for j := i + 1; j < len(arr); j++ {
            if arr[tag] > arr[j] {
                tag = j
            }
        }
        arr[i], arr[tag] = arr[tag], arr[i]
    }
    return arr
}

測試:

func main() {
    arr := []int{2, 0, 44, 1, 2, 34, 32, 10}
    fmt.Println(SelectionSort(arr))  //列印:[0 1 2 2 10 32 34 44]

}

C++:

#include <iostream>

using namespace std;

template<typename T>
void selectionSort(T arr[], int n){

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

        int minIndex = i;
        for( int j = i + 1 ; j < n ; j ++ )
            if( arr[j] < arr[minIndex] )
                minIndex = j;

        swap( arr[i] , arr[minIndex] );
    }
}

如下是測試:

int main() {

    // 測試模板函式,傳入整型陣列
    int a[10] = {2,6,12,32,54,77,53,45,31,200};
    selectionSort( a , 10 );
    for( int i = 0 ; i < 10 ; i ++ )
        cout<<a[i]<<" ";
    cout<<endl;

    // 測試模板函式,傳入浮點數陣列
    float b[4] = {4.4,3.3,2.2,1.1};
    selectionSort(b,4);
    for( int i = 0 ; i < 4 ; i ++ )
        cout<<b[i]<<" ";
    cout<<endl;

    // 測試模板函式,傳入字串陣列
    string c[4] = {"D","C","B","A"};
    selectionSort(c,4);
    for( int i = 0 ; i < 4 ; i ++ )
        cout<<c[i]<<" ";
    cout<<endl;
    return 0;
}

其輸出結果為:

selection_Sort(選擇排序演算法)

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章