1. 程式人生 > >算法系列——選擇排序(Selection Sort)

算法系列——選擇排序(Selection Sort)

選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。 選擇排序是不穩定的排序方法。時間複雜度是O(n^2)。

在完全隨機陣列的條件下進行排序實驗。

程式碼段一:

template<typename T>
void selectionSort(T arr[], int n)
{
    //arr為陣列,n為長度
    //選擇排序演算法,每次選擇剩餘資料中最小的值
    for (int i = 0; i < n; i++)
    {
        for
(int j = i+1; j < n; j++) { if (arr[i] > arr[j]) { swap(arr[i], arr[j]); } } } }
int main()
{
    int n = 10000;
    int* arr = Helper::generateRandomArray(n, 0, n);
    Helper::testSort("SelectionSort", selectionSort, arr, n);

    return
0; }

這裡寫圖片描述 實驗可知,10000資料量的隨機陣列使用以上的選擇排序,用時2.34s 這裡寫圖片描述 100000資料量的隨機陣列使用以上的選擇排序,用時145.393s。

程式碼段二: 嘗試優化選擇排序演算法,使用一個整型變數,每次比較用該整型變數記錄最小值的索引,取代每次比較交換值的操作,減少了演算法的操作步驟,從而優化了演算法的執行時間。

template<typename T>
void selectionSortProve(T arr[], int n)
{
    //arr為陣列,n為長度
    //選擇排序演算法,每次選擇剩餘資料中最小的值
    for (int i = 0; i < n; i++)
    {
        int
index = i; for (int j = i + 1; j < n; j++) { if (arr[j]<arr[index]) { index = j; } } swap(arr[index], arr[i]); } }
int main()
{
    int n = 10000;
    int* arr = Helper::generateRandomArray(n, 0, n);
    Helper::testSort("SelectionSort", selectionSort, arr, n);
    Helper::testSort("SelectionSortProve", selectionSortProve, arr, n); 

    return 0;
}

10000的資料量: 10000的資料量 100000的資料量: 這裡寫圖片描述 可知,在同等資料量下,優化後的選擇演算法大大的快於優化前的選擇演算法。

在接近有序的陣列的條件下進行排序實驗。

未優化前的程式碼在10000的資料量下實驗:

int main()
{
    int n = 10000;
    int* arr = Helper::generateNearlyOrderArray(n, 0, n, 10);
    Helper::testSort("SelectionSort", selectionSort, arr, n);
    return 0;
}

這裡寫圖片描述 在100000的資料量100的混亂度下實驗: 這裡寫圖片描述

優化後的程式碼在10000的資料量下實驗: 這裡寫圖片描述 在10000的資料量100的混亂度下實驗: 這裡寫圖片描述 可見,在接近有序的情況下,兩者的效率相差不大。