選擇排序的基本思想:每次從待排序的記錄中選出關鍵字最小(或最大的)記錄,順序存放已經排序的記錄序列的後面(或前面),直到所有排完。html
同插入排序同樣,分爲有序段和無序段,不一樣的的是選擇排序是從沒有排好序段中找出最小(或最大)的元素添加在有序序列段後後面,這樣子有序序列段不斷邊長,直至全部的序列均排好序。算法
實例分析:(紅色表示已經有序段,黑色表示無序段,綠色表示剛被替換的元素)數據結構
初始狀態: 70 30 40 10 80 20 90 100 75 60 45 共11個元素ide
第一次: 10 30 40 70 80 20 90 100 75 60 45 剛開始全部的序列均認爲是無序的,從中找出最小值 10 並與a[0]交換 spa
第二次: 10 20 40 70 80 30 90 100 75 60 45 從剩下的無序段中找出最小值 20 並與a[1]交換 code
第三次: 10 20 30 70 80 40 90 100 75 60 45 從剩下的無序段中找出最小值 30 並與a[2]交換 htm
第四次: 10 20 30 40 80 70 90 100 75 60 45 從剩下的無序段中找出最小值 40 並與a[3]交換 blog
第五次: 10 20 30 40 45 70 90 100 75 60 80 從剩下的無序段中找出最小值 45 並與a[4]交換 排序
第六次: 10 20 30 40 45 60 90 100 75 70 80 從剩下的無序段中找出最小值 60 並與a[5]交換 get
第七次: 10 20 30 40 45 60 70 100 75 90 80 從剩下的無序段中找出最小值 70 並與a[6]交換
第八次: 10 20 30 40 45 60 70 75 100 90 80 從剩下的無序段中找出最小值 75並與a[7]交換
第九次: 10 20 30 40 45 60 70 75 80 90 100 從剩下的無序段中找出最小值 80 並與a[8]交換
第十次: 10 20 30 40 45 60 70 75 80 90 100 從剩下的無序段中找出最小值 90 ,此時不用交換 ,此時程序已經排好序了
參考代碼:
#include <stdio.h> #define MAX_NUM 80 void selectsort(int* a, int n) { for (int i = 0; i < n-1; i++) { int k = i; for(int j = i+1; j < n; j++) { if(a[k] > a[j]) { k = j; } } if( k != i) { int t = a[i]; a[i]=a[k]; a[k] = t; } for(int i = 0; i < n;i++) { printf("%d ",a[i]); } printf("\n"); } } int main(int argc, char* argv[]) { int a[MAX_NUM]; int n; printf("Input total numbers: "); scanf("%d",&n); if( n > MAX_NUM ) n = MAX_NUM; for(int i = 0; i < n;i++) { scanf("%d",&a[i]); } printf("排序步驟:\n"); selectsort(a,n); return 0; }
案例結果截圖:
選擇排序算法效率與穩定性分析
在選擇排序中,第一次排序要進行n-1次比較,第二次排序要進行n-2比較,第n-1次排序比較須要進行一次比較,因此總的比較次數爲n(n-1)/2。
在一次排序過程時,記錄的移動次數最好是0次,最壞爲3次,所以,總的移動次數最好爲0次,最壞爲3次,雖然整個排序古城中移動次數很少,可是總的比較次數不少,所以選擇排序算法的時間複雜度爲O(n2)。
選擇排序算法只須要一個輔助空間用於記錄交換記錄以及另外一個用於記錄,對於存儲空間沒有太高的要求。在排序過程當中,每次比較和值交換都只在兩個元素之間,故序列中關鍵字相同的元素其位置不會發生改變,因此,選擇排序算法是一種穩定的排序方法。
注:主要參考彭軍、向毅主編的 《數據結構與算法》