原始代碼問題
void sort(char *name[], int n) {
char *temp;
int i, j, k;
for (i = 0; i < n-1; i++) {
k = i;
for (j = i+1; j < n; j++)
if (strcmp(name[k], name[i]) < 0) // 錯誤:應比較 name[j] 與 name[k]
k = j;
if (k != i) {
temp = name[i];
name[i] = name[k];
name[k] = temp;
}
}
}
錯誤分析
- 內層循環變量是
j,但比較時卻使用 name[i] 作為基準,導致選擇排序邏輯錯誤。
- 正確邏輯:每輪找到最小元素索引
k,需將 name[j] 與當前最小 name[k] 比較。
修正後的選擇排序
void sort(char *name[], int n) {
char *temp;
int i, j, k;
for (i = 0; i < n-1; i++) {
k = i;
for (j = i+1; j < n; j++) {
if (strcmp(name[j], name[k]) < 0) // 修正:name[j] vs name[k]
k = j;
}
if (k != i) {
temp = name[i];
name[i] = name[k];
name[k] = temp;
}
}
}
完整可運行示例
#include <stdio.h>
#include <string.h>
void sort(char *name[], int n) { /* 上述修正代碼 */ }
void print(char *name[], int n) {
for (int i = 0; i < n; i++) puts(name[i]);
}
int main() {
char *name[] = {"C programming", "BASIC", "Java", "FORTRAN", "Computer"};
int n = 5;
sort(name, n);
print(name, n);
return 0;
}
輸出結果 (字典序升序)
BASIC
C programming
Computer
FORTRAN
Java
關鍵點提示
strcmp(s1, s2) < 0 表示 s1 字典序小於 s2。
- 選擇排序每輪只交換一次,適合指針數組排序(移動指針而非數據)。
- 若需降序,將比較條件改為
> 0。