1. 程式人生 > >排序演算法5——簡單選擇排序

排序演算法5——簡單選擇排序

簡單選擇排序的平均複雜度為 \(O(n^2)\), 但效率通常比相同平均複雜度的直接插入排序還要差。但由於選擇排序是 內部排序,因此在記憶體嚴格受限的情況下還是可以用的。

選擇排序的原理很簡單,如下圖所示:

持續從未處理元素中找到最小值並加入到已排序列中。

黃色 表示已經排好序的子序列;藍色表示當前處理項;紅色表示當前最小值

這裡寫圖片描述

c++實現程式碼如下:

#include  <iostream>
using namespace std;

// 資料交換子函式
void swap(int *data1, int *data2)
{
    int temp = *data1;
    *data1 = *data2;
    *data2 = temp;
}

// 選擇排序函式,輸入陣列data和資料個數n
void selectSort(int data[], int n) { int i, j, min_idx; // 外層迴圈,依次處理每一個元素 for (i = 0; i < n-1; i++) { // 內層迴圈,從未處理元素中找到最小值位置 min_idx = i; for (j = i+1; j < n; j++) if (data[j] < data[min_idx]) min_idx = j; // 交換最小值 swap(&data[min_idx], &data[i]); } } // 列印陣列
void printarray(int data[], int n) { for (int i=0; i<n; i++) cout << data[i] << " "; } int main() { int data[] = {12, 34, 54, 2, 3, 12, 27, 1}; int n = 8; cout << "data before shell sorting: \n"; printarray(data, n); selectSort(data, n); cout
<< "\ndata after shell sorting: \n"; printarray(data, n); return 0; }

選擇排序是最容易分析的,因為完整的兩層迴圈沒有跳出,迴圈次數為 \(\frac{n(n-1)}{2}\)。

總結

通過將上面的程式和直接插入排序相比,顯然前者的迴圈次數要高一些,即選擇排序的效率甚至還要低於直接插入排序。 但是,又可以看出前者的資料交換次數明顯更少,這對於一些寫比讀更耗時的裝置是一個優點。

參考資料: