C 語言初學教材 - 第五章 氣泡排序的函數版本

利用氣泡排序法排列陣列元素,我們在登入程式利用兩個 for 迴圈

// sort 為排序指令
if (!strcmp(instruction, "sort")) {
    for (j = 1; j < SIZE - 1; j++) {
        for (k = 2; k < SIZE; k++) {
            if (userID[k - 1][0] > userID[k][0]) {
                strcpy(tempName, userID[k - 1]);
                strcpy(tempCode, userCODE[k - 1]);
                strcpy(userID[k - 1], userID[k]);
                strcpy(userCODE[k - 1], userCODE[k]);
                strcpy(userID[k], tempName);
                strcpy(userCODE[k], tempCode);
            }
        }
    }
}


逐一測試每個字串的第一個字元的大小,也就是 ASCII 編碼的排列順序,最後會依第一個字元的 ASCII 編碼的順序排列。


現在我們來將氣泡排序寫成函數,先思考比較簡單的例子,排序整數陣列,例如以下的整數陣列
int testa[10] = {3, 2, 8, 1, 9, 4, 7, 6, 5, 0};


由於做的是排序動作,所以函數不需要有回傳值,參數則需要陣列名稱及陣列大小
void nsort(int array[], int size);


這裡用為參數的陣列 array[] 並不需要提供元素個數,因為陣列名稱等同於指標,需要中括弧 [] 說明是陣列即可,所以另外需要表示陣列大小的參數 size 。實際的排序整數陣列的函數如下
void nsort(int array[], int size)
{
    int i, j, temp;
    
    for (i = 0; i < size - 1; i++) {
        for (j = 1; j < size; j++) {
            if (array[j - 1] > array[j]) {
                temp = array[j - 1];
                array[j - 1] = array[j];
                array[j] = temp;
            }
        }
    }
}



這個排序函數適用於所有整數型態的陣列,排序字元型態的陣列雷同,在此不贅述。


回到我們登入程式的例子,我們需要的是排序字串的函數,假設要排序以下的二維字元陣列
char testc[10][10] = {"john", "mary", "", "lily", "", "park", "elsa", "sam", "apple", "neo"}; 


利用二維字元陣列當作函數的參數,必須提供每個陣列元素的大小,也就是第二個索引值。排序字串陣列的函數原型宣告如下
void ssort(char array[][10], int size);


排序字串陣列的函數定義如下
void ssort(char array[][10], int size)
{
    int i, j;
    char temp[10];
    
    for (i = 0; i < size - 1; i++) {
        for (j = 1; j < size; j++) {
            if (array[j - 1][0] > array[j][0]) {
                strcpy(temp, array[j - 1]);
                strcpy(array[j - 1], array[j]);
                strcpy(array[j], temp);
            }
        }
    }
}


由於這個排序是依據 ASCII 編碼的順序,若是字串陣列中含有空字串,也就是字串中所有元素均為 '\0' 的字元陣列,由於 '\0' 在 ASCII 排列的序數為 0 ,所以所有的空字串都會被排列到字串陣列的前方。


完整的範例程式碼及編譯執行,請繼續參考


問題與討論
  1. 為什麼排序不同型態的陣列要寫成不同的函數?
  2. 我們要怎麼知道排序函數會運作成功呢?




沒有留言: