1、選擇排序概念算法
選擇排序(Selection Sort)的基本思想:對n個記錄進行掃描,選擇最小的記錄,將其輸出,接着在剩下的n-1個記錄中掃描,選擇最小的記錄將其輸出……不斷重複這個過程,直到只剩一個記錄爲止,便可完成數據從小到大的排序過程。
提示:若是要求數據按從大到小排序,則每次掃描時選擇最大的記錄便可。
選擇排序經常使用的算法有:簡單選擇排序和堆排序,本文介紹簡單選擇排序法,
簡單選擇排序法相似人的排序習慣:從數據中選擇最小(或最大)的一個數據,而後將該數與第1個數交換,接下來從剩下數據中選擇最小(或最大)的一個數,第2個數進行交換……這樣重複下去,直到只剩下一個數據爲止。
下面以一組待排序的數據演示簡單選擇排序的過程,假設有8個須要排序的數據序列以下所示:
69,65,90,37,92,6,28,54
使用簡單選擇排序法進行排序的過程以下圖所示。數組
首先對數組中的原始數據進行掃描,找到最小的一個數6,與第1個元素69進行交換,完成第一遍選擇排序的結果,而後不斷重複這個過程,到第7遍掃描後,完成整個數據序列的排序。
注意:在簡單選擇排序法中,某一遍掃描沒有數據交換並不能說明數據就已經按順序排好了,還必須進行後續的掃描。測試
2、簡單選擇排序法的實現code
(1)實現排序
void SelectSort(int a[], int n) { int i, j, t, k; for (i=0; i<n; i++) { k = i; //記錄和第k個元素交換位置 for (j=i+1; j<n; j++) {//查找最小數據,保存其序號在k中 if (a[j] < a[k]) k = j; } t = a[i]; //交換最小數據到數組前面 a[i] = a[k]; a[k] = t; } }
(2)測試io
void ShowData(int arr[], int n) { int i; for (i=0; i<n; i++) printf("%d ", arr[i]); printf("\n"); return; } #define ARRAYLEN 10 int main(int argc, char *argv[]) { int i; int a[ARRAYLEN] = {94, 84, 54, 80, 62, 83, 37, 24, 67, 29}; printf("原數據:"); ShowData(a, ARRAYLEN); SelectSort(a, ARRAYLEN); printf("排序後:"); ShowData(a, ARRAYLEN); return 0; }
(3)運行結果class