1. 程式人生 > >八大排序演算法(3) 簡單選擇排序

八大排序演算法(3) 簡單選擇排序

基本思路

每次選出剩餘序列中最小/最大的數、與剩餘序列的第一個交換位置。

示例:

// 升序,左起
/*初始值*/    10, 7, 1, 8, 5, 12, 6, 3, 9

/*第1趟*/     1, 7, 10, 8, 5, 12, 6, 3, 9
/*第2趟*/     1, 3, 10, 8, 5, 12, 6, 7, 9
/*第3趟*/     1, 3, 5, 8, 10, 12, 6, 7, 9
/*第4趟*/     1, 3, 5, 6, 10, 12, 8, 7, 9
/*第5趟*/     1, 3, 5, 6, 7, 12, 8, 10, 9
/*第6趟*/     1, 3, 5, 6, 7, 8
, 12, 10, 9 /*第7趟*/ 1, 3, 5, 6, 7, 8, 9, 10, 12 /*第8趟*/ 1, 3, 5, 6, 7, 8, 9, 10, 12 /*第9趟*/ 1, 3, 5, 6, 7, 8, 9, 10, 12

程式碼

void printList(int *l, int n) {
    for (int i = 0; i < n; i++) {
        printf("%d ", l[i]);
    }
    printf("\n");
}

int main() {
    int list[50] = { 10, 7, 1 , 8
, 5, 12, 6, 3, 9}; printList(list, 9); // 簡單選擇排序,每次選取最小的放最前面 for (int i = 0; i < 9; i++ ) { int minIndex = i; for (int j = i+1; j < 9; j++){ if ( list[j] < list[minIndex]){ // 替換最小值的 index minIndex = j; } } int
k = list[i]; list[i] = list[minIndex]; list[minIndex] = k; printList(list, 9); } system("pause"); return 0; }

進階 – 二元選擇排序

簡單選擇排序每次迴圈只選出了一個數, 二元選擇排序則同時選出最大最小的元素。
這樣外迴圈只需要 n/2 次就能得到結果。

示例:

// 升序,二選選擇排序
/*初始值*/    10, 7, 1, 8, 5, 12, 6, 3, 9

/*第1趟*/     1, 7, 10, 8, 5, 9, 6, 3, 12
/*第2趟*/     1, 3, 7, 8, 5, 9, 6, 10, 12
/*第3趟*/     1, 3, 5, 8, 7, 6, 9, 10, 12
/*第4趟*/     1, 3, 5, 6, 7, 8, 9, 10, 12

程式碼

int main() {
    int list[50] = { 10, 7, 1 , 8, 5, 12, 6, 3, 9};
    printList(list, 9);
    // 二元選擇排序,每次選取最小的放最前面,選最大的放後面
    for (int i = 0; i < 9 / 2; i++) {
        int minIndex = i;
        int maxIndex = i;
        for (int j = i+1; j < 9 - i; j++){
            if ( list[j] < list[minIndex]  ){
                minIndex = j;       // 找出最小
            } else if ( list[j] > list[maxIndex] ){
                maxIndex = j;       // 找出最大
            }
        }

        if ( i != minIndex ){
            int k = list[i];
            list[i] = list[minIndex];
            list[minIndex] = k;

        }

        // 要特別留意 maxIndex == i 的時候,i 可能會被換掉
        if ( maxIndex == i ){
            maxIndex = minIndex;
        }

        int m = list[9 - i - 1];
        list[9 - i - 1] = list[maxIndex];
        list[maxIndex] = m;
        printList(list, 9);
    }

system("pause");
return 0;
}

以上