排序演算法2——圖解簡單選擇排序及其實現
阿新 • • 發佈:2018-12-16
排序演算法1——圖解氣泡排序及其實現(三種方法,基於模板及函式指標)
排序演算法2——圖解簡單選擇排序及其實現
排序演算法3——圖解直接插入排序以及折半(二分)插入排序及其實現
排序演算法4——圖解希爾排序及其實現
排序演算法5——圖解堆排序及其實現
排序演算法6——圖解歸併排序及其遞迴與非遞迴實現
排序演算法7——圖解快速排序以及不同CUTOFF的時間測試
基本思想
通過
n-i
次關鍵字之間的比較,從n-i+1
個記錄中選出關鍵字最小的記錄,並和第i個記錄作交換
程式碼和上下界
比較過程如下
這樣,最多經過
n-1
次交換,就能完成排序操作
下面分析簡單選擇排序的時間複雜度
無論最好或最壞的情況下,其比較次數都是一樣多的,
第i趟需要進行n-i
次關鍵字的比較,總共需要比較∑(n-i)=n(n-1)/2次,i從1到n-1
,
而對於交換次數來說,當最好的時候,不需要進行資料的交換
而當逆序的時候,交換次數為n-1
次,
最終的排序時間是比較與交換的次數總和,
因此,總的時間複雜度為O(N^2)
雖然與氣泡排序相比,時間複雜度相等,但簡單選擇排序的效能比氣泡排序要好一些
測試結果和程式碼
#include <iostream>
template<class T>
void SelectSort(T *a, int length) {
int min;
int i, j;
for (i = 0; i < length - 1; ++i) {
min = i;
for (j = i + 1; j < length; ++j) {
if (a[min] > a[j]) {
min = j;
}
}
if (i != min) {
T tmp;
tmp = a[min];
a[min] = a[i];
a[i] = tmp;
}
}
}
template<class T>
void ArrShow(T *a, int length) {
for (int i = 0; i < length; ++i) {
std::cout << a[i] << " ";
}
puts("\n");
}
int main(int argc, char *argv[]) {
int test[9] = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
ArrShow(test, 9);
puts("SelectSort : ");
SelectSort(test, 9);
ArrShow(test, 9);
return 0;
}