直接從待排序數組裏選擇一個最小(或最大)的數字,每次都拿一個最小數字出來,
順序放入新數組,直到全部拿完
再簡單點,對着一羣數組說,你們誰最小出列,站到最後邊
然後繼續對剩餘的無序數組說,你們誰最小出列,站到最後邊
再繼續剛纔的操作,一直到最後一個,繼續站到最後邊,現在數組有序了,從小到大
舉例
先說看每步的狀態變化,後邊介紹細節。
現有無序數組[6 2 4 1 5 9]
第一趟找到最小數1,放到最前邊(與首位數字交換)
交換前:| 6 | 2 | 4 | 1 | 5 | 9 |
交換後:| 1 | 2 | 4 | 6 | 5 | 9 |
第二趟找到餘下數字[2 4 6 5 9]裏的最小數2,與當前數組的首位數字進行交換,實際沒有交換,本來就在首位
交換前:| 1 | 2 | 4 | 6 | 5 | 9 |
交換後:| 1 | 2 | 4 | 6 | 5 | 9 |
第三趟繼續找到剩餘[4 6 5 9]數字裏的最小數4,實際沒有交換,4待首位置無須交換
第四趟從剩餘的[6 5 9]裏找到最小數5,與首位數字6交換位置
交換前:| 1 | 2 | 4 | 6 | 5 | 9 |
交換後:| 1 | 2 | 4 | 5 | 6 | 9 |
第五趟從剩餘的[6 9]裏找到最小數6,發現它待在正確的位置,沒有交換
排序完畢輸出正確結果[1 2 4 5 6 9]
第一趟找到最小數1的細節
當前數組是| 6 | 2 | 4 | 1 | 5 | 9 |
先把6取出來,讓它扮演最小數
當前最小數6與其它數一一進行比較,發現更小數就交換角色
當前最小數6與2比較,發現更小數,交換角色,此時最小數是2,接下來2與剩餘數字比較
當前最小數2與4比較,不動
當前最小數2與1比較,發現更小數,交換角色,此時最小數是1,接下來1與剩餘數字比較
當前最小數1與5比較,不動
當前最小數1與9比較,不動,到達末尾
當前最小數1與當前首位數字進行位置交換,如下所示
交換前:| 6 | 2 | 4 | 1 | 5 | 9 |
交換後:| 1 | 2 | 4 | 6 | 5 | 9 |
完成一趟排序,其餘步驟類似
C語言代碼:
- #include <stdio.h>
- int main()
- {
- int a[5]={5,4,3,2,1},i;
- printf("原本的數字爲:");
- for(i=0;i<5;i++)
- {
- printf("%d ",a[i]);
- }
- printf("\n");
- void choose (int a[],int n);
- choose (a,5);
- printf("選擇法排序後:");
- for(i=0;i<5;i++)
- {
- printf("%d ",a[i]);
- }
- return 0;
- }
- //選擇法
- void choose (int a[],int n)
- {
- int i,j,k,temp;
- for(i=0;i<n-1;i++)
- {
- k=i;//給記號賦值
- for(j=i+1;j<n;j++)
- {
- if (a[k]>a[j]);
- {
- k=j;//使k總是指向最小元素
- }
- if (i!=k)//當k!=i時才交換
- {
- temp=a[i];
- a[i]=a[k];
- a[k]=temp;
- }
- }
- }
- }
引用:http://www.cnblogs.com/kkun/archive/2011/11/23/2260281.html