// 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 ,所以所有的空字串都會被排列到字串陣列的前方。
完整的範例程式碼及編譯執行,請繼續參考
問題與討論
- 為什麼排序不同型態的陣列要寫成不同的函數?
- 我們要怎麼知道排序函數會運作成功呢?
沒有留言:
張貼留言