1. 程式人生 > >排序演算法2——圖解簡單選擇排序及其實現

排序演算法2——圖解簡單選擇排序及其實現

排序演算法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; }