選擇排序法可使用兩種方式排序, 一為在所有資料中, 當由大至小排序, 則將最大值放入第一個位置 ; 若由小至大排列, 則將最大值放入位置的末端. 例如當 N 筆資料需要由小至大排列時, 首先以第一個位置的資料, 依序向 2,3,4...N 個位置做比較. 如果資料大於或等於其中一個位置, 則繼續比較 ; 若小於其中某一個位置, 則將兩個位置的資料互換. 互換後則繼續比下一筆資料直到末端. 此時第一個位置可以得到資料堆的最小值. 接下來選擇第二個位置資料依序向 3,4,5...N 個位置做比較. 依序就上述方法直到 (N-1) 個位置都比較完後, 就完成了由小到大的排列.
選擇排序範例 :
以下排序我們利用 6,4,9,8,3 由小到大排序過程來解釋選擇排序法的演算流程 :
第一次掃描 :
6 4 9 8 3 : 比較 6 > 4 : 交換 6 與 4
4 6 9 8 3 : 比較 4 < 9 : 不交換
4 6 9 8 3 : 比較 4 < 8 : 不交換
4 6 9 8 3 : 比較 4 > 3 : 交換 4 與 3, 得第一次掃描結果 3 6 9 8 4
第二次掃描 :
3 6 9 8 4 : 比較 6 < 9 : 不交換
3 6 9 8 4 : 比較 6 < 8 : 不交換
3 6 9 8 4 : 比較 6 < 4 : 交換 6 與 4, 得第二次掃描結果 3 4 9 8 6
第三次掃描 :
3 4 9 8 6 : 比較 9 > 8 : 交換 9 與 8
3 4 8 9 6 : 比較 8 > 6 : 交換 8 與 6, 得第三次掃描結果 3 4 6 9 8
第四次掃描 :
3 4 6 9 8 : 比較 9 > 8 : 交換 9 與 8, 得第四次掃描結果 3 4 6 8 9
選擇法分析 :
範例代碼 :
- #include
- using namespace std;
- struct BenchMark {
- int swapTime;
- int verifyTime;
- };
- BenchMark selectSort(int data[], int n) {
- int cnt=0, vt=0;
- BenchMark bm;
- for(int i=0; i<(n-1); i++) {
- for(int j=(i+1); j
- vt++;
- //printf("%d with %d\n", i, j);
- if(data[i]>data[j]) {
- int tmp = data[i];
- data[i] = data[j];
- data[j] = tmp;
- cnt++;
- }
- }
- }
- bm.swapTime = cnt;
- bm.verifyTime = vt;
- return bm;
- }
- void main(bool b) {
- if(b) {
- int data[6] = {2,5,9,7,6,8};
- cout<< "原始資料: " << endl;
- for(int i=0; i<6; i++) {
- printf("%2d ",data[i]);
- }
- printf("\n");
- BenchMark bm = selectSort(data, 6);
- cout << "選擇排序: " << endl;
- for(int i=0; i<6; i++) {
- printf("%2d ",data[i]);
- }
- printf("\n");
- printf("Swap time: %d\n", bm.swapTime);
- printf("Verify time: %d\n", bm.verifyTime);
- }
- }
沒有留言:
張貼留言