演算法基礎:排序演算法:選擇排序

淼叔發表於2020-10-26

在這裡插入圖片描述
選擇排序是除氣泡排序之外特別容易被理解的排序演算法了,這篇文章介紹一下選擇排序的主要要點和實現。



演算法思路

  • 選擇排序和氣泡排序非常相像,都是使用比較和交換作為排序的重要手段,每次外層迴圈得到一個未排序的最小值,將序列分為已排序和未排序兩種。但區別也非常清晰,氣泡排序的交換在內層迴圈進行,選擇排序的交換在外層進行,內層迴圈只需要獲取當次迴圈最小元素的下標。

演算法要點

選擇排序的主要要點如下所示(N個元素,陣列元素從0開始計數):

  • 外層迴圈:0 <= i < N - 1 (N-1次迴圈) 遞加方式迴圈即可
  • 最小值標誌:在外層迴圈開始設定為當前下標,內層迴圈中確認當前最小元素下標,當前內層迴圈結束後在外層迴圈中判斷是否需要進行交換,定義此變數的好處在於不必在內層迴圈中進行交換。
  • 內層迴圈:將內層迴圈中的元素(包括當前元素)逐個與當前外層元素比較,以獲得此次迴圈中的最小元素的下標
  • 比較:比較物件為外層迴圈的當前元素和內層迴圈的所有元素
  • 交換:在外層迴圈中直接進行當前元素和進行最小元素的交換

模擬實現

void select_sort(int* arr, int num) {
    for (int i=0; i<num-1; i++) {
        int min_index = i;
        for (int j=i; j<num; j++) {
            if (arr[j] < arr[min_index]) min_index = j;
        }
        int tmp = arr[i]; arr[i]=arr[min_index]; arr[min_index]=tmp;
    }
}

結果驗證

加上列印和呼叫的示例程式碼,可以使用如下方式進行驗證

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void select_sort(int* arr, int num) {
    for (int i=0; i<num-1; i++) {
        int min_index = i;
        for (int j=i; j<num; j++) {
            if (arr[j] < arr[min_index]) min_index = j;
        }
        int tmp = arr[i]; arr[i]=arr[min_index]; arr[min_index]=tmp;
    }
}

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

int main() {
    int n = 0;
    while (scanf("%d",&n) != EOF) {
        int* array = (int *)malloc(sizeof(int)*n);
        memset(array,0,sizeof(int)*n);
        for (int i=0; i<n; i++) {
            scanf("%d",&array[i]);
        }
        select_sort(array,n);
        print_array(array,n);
        free(array); array= NULL;
    }
}

執行結果示例

9
9 8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 9 

相關文章