對字符串陣列排序,若直接交換字符串內容(strcpy),開銷極大。標準做法:指針數組存儲字符串地址,排序時僅交換指針,避免內存搬移。本文演示優化版冒泡排序(提前結束標誌位)對 char* 陣列排序。
#include <stdio.h>
#include <string.h>
int main() {
char *str[] = {"hello", "change", "world", "come", "on"};
int size = sizeof(str) / sizeof(str[0]);
for (int i = 0; i < size - 1; i++) {
int swapped = 0; // 優化標誌位
for (int j = 0; j < size - 1 - i; j++) {
if (strcmp(str[j], str[j+1]) > 0) { // 字典序比較
char *tmp = str[j];
str[j] = str[j+1];
str[j+1] = tmp;
swapped = 1;
}
}
if (!swapped) break; // 本輪無交換,已有序,提前結束
}
for (int i = 0; i < size; i++) printf("%s ", str[i]);
// 輸出: change come hello on world
return 0;
}
char *tmp = str[j]; str[j] = str[j+1]; ... 僅 3 次指針賦值,O(1),不涉及字符拷貝。swapped 標誌位,最好情況(已有序)僅 1 趟掃描 O(N)。j < size - 1 - i,每輪最大元素「冒泡」到末尾,無需重複比較。| 指標 | 值 |
|---|---|
| 最壞時間 | O(N²) |
| 最好時間 | O(N)(已有序) |
| 平均時間 | O(N²) |
| 空間 | O(1) |
| 穩定性 | 穩定(相等不交換) |
qsort(快速排序)、std::sort(C++)、TimSort 等 O(N log N) 演算法。