排序演算法5——簡單選擇排序
阿新 • • 發佈:2019-02-12
簡單選擇排序的平均複雜度為 \(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}\)。
總結
通過將上面的程式和直接插入排序相比,顯然前者的迴圈次數要高一些,即選擇排序的效率甚至還要低於直接插入排序。 但是,又可以看出前者的資料交換次數明顯更少,這對於一些寫比讀更耗時的裝置是一個優點。
參考資料: