前篇的插入排序算法,爲了給插入元素空出位置,常常要後移騰出位置而進行大量後移操做,若是是移動數據元素規模大的話,就會耗時下降效率。算法
插入排序操做特色:先肯定排序對象,再肯定插入位置。數組
選擇排序操做特色:先肯定排序位置,再肯定排序對象。code
選擇排序大概流程就是從第一個元素開始,而後與後面的元素依次比較大小,比當前元素小的話就記下當前最小位置,繼續比較,直到這輪比較完畢,這樣就能夠找出這一輪最小的元素,而後把此最小元素放入第一個元素位置。而後從第二個元素開始,繼續上面的操做。最後就能排好序。對象
下面的代碼實現了選擇排序的操做練習。排序
#include <stdio.h> #define MAXSIZE 50 void Select_sort(int *s, int n); int main(void) { int n, i; int s[MAXSIZE + 1]; printf("選擇排序練習:\n"); printf("輸入想輸入數據的個數:"); scanf("%d", &n); getchar(); printf("依次輸入想輸入的數據\n"); for(i=1; i<=n; i++) { scanf("%d", &s[i]); } Select_sort(s, n); printf("排序後的數據爲:\n"); for(i=1; i<=n; i++) { printf("%d ",s[i]); } printf("\n"); return 0; } void Select_sort(int *s, int n) { int i, j, k; for(i=1; i<=n; i++) { k = i; //假定當前元素爲最小值 for(j=i+1; j<=n; j++) { if(s[j] < s[k]) { k = j; //記錄當前最小值的下標 } } if(k != i) //把真正最小元素值放入正確位置 { s[0] = s[k]; s[k] = s[i]; s[i] = s[0]; } } }
該算法主要兩部分組成,一種是比較操做,一種是交換操做,進行一次交換操做至關於進行三次移動操做。但工做量仍是比一次比較操做工做量小。該算法主要工做量爲內層循環的比較操做。get
選擇排序也只須要一個備用單元,即數組下標爲0的元素和3個輔助變量i,j,k。io
選擇排序不一樣於插入排序,只能用於靜態排序。class