在 C 語言中,字符串本質是字符數組,直接移動字符串效率極低。通過指針數組僅交換指針指向,即可高效實現字符串排序。本文展示冒泡排序與標準庫 qsort 兩種實現。
#include <stdio.h>
#include <string.h>
void sort_strings(char *str[], int size) {
int i, j;
char *tmp;
for (i = 0; i < size - 1; i++) {
for (j = i + 1; j < size; j++) {
if (strcmp(str[i], str[j]) > 0) {
tmp = str[i];
str[i] = str[j];
str[j] = tmp;
}
}
}
}
int main() {
char str[5][20]; // 存儲 5 個字符串,每個最長 19 字符
char *p[5]; // 指針數組,指向各字符串首地址
int i;
printf("請輸入 5 個字符串:\n");
for (i = 0; i < 5; i++) {
scanf("%19s", str[i]); // 防止緩衝區溢出
p[i] = str[i];
}
sort_strings(p, 5);
printf("\n排序後結果:\n");
for (i = 0; i < 5; i++) {
printf("%s\n", p[i]);
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// qsort 要求的比較函數
int cmp_str(const void *a, const void *b) {
const char *pa = *(const char **)a;
const char *pb = *(const char **)b;
return strcmp(pa, pb);
}
int main() {
char str[5][20];
char *p[5];
int i;
printf("請輸入 5 個字符串:\n");
for (i = 0; i < 5; i++) {
scanf("%19s", str[i]);
p[i] = str[i];
}
qsort(p, 5, sizeof(char *), cmp_str);
printf("\n排序後結果:\n");
for (i = 0; i < 5; i++) {
printf("%s\n", p[i]);
}
return 0;
}
初始狀態: 排序過程中: str[0] = "delta" ← p[0] p[0] ↔ p[2] 交換指針 str[1] = "alpha" ← p[1] 字符串本身在內存中不動 str[2] = "epsilon" ← p[2] str[3] = "beta" ← p[3] str[4] = "gamma" ← p[4]
char str[5][20] 分配連續內存存字符;char *p[5] 只存地址qsort 不保證穩定qsort 平均 O(n log n)qsort,代碼更簡潔、性能更優若字符串數量和長度不固定,可結合 malloc/free 實現完全動態的字符串排序系統。