演算法:冒泡排序
- 比較相鄰字串,若前者大於後者則交換指標。
- 外層
n-1 趟,內層遞減。
- 字串比較用
strcmp,返回 >0 表示前者大。
完整代碼
#include
#include
void sort(char *a[], int n) {
for (int i = 0; i < n - 1; ++i) {
for (int j = 0; j < n - 1 - i; ++j) {
if (strcmp(a[j], a[j + 1]) > 0) {
char *tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
}
}
}
}
void print(char *a[], int n) {
for (int i = 0; i < n; ++i) printf("%s ", a[i]);
putchar('\n');
}
int main(void) {
char *a[] = {"ceo", "define", "basic", "abc", "empty"};
int n = sizeof(a) / sizeof(a[0]);
printf("原序列:"); print(a, n);
sort(a, n);
printf("排序後:"); print(a, n);
return 0;
}
輸出結果
原序列:ceo define basic abc empty
排序後:abc basic ceo define empty
優化建議
- 加入標誌位
swapped,若某趟無交換則提前結束。
- 實際專案優先使用
qsort(快速排序,O(n log n))。
qsort 範例:
int cmp_str(const void *p1, const void *p2) {
return strcmp(*(char* const*)p1, *(char* const*)p2);
}
qsort(a, n, sizeof(char*), cmp_str);
複雜度
| 演算法 | 時間 | 空間 | 穩定性 |
| 冒泡 | O(n²) | O(1) | 穩定 |
| qsort | O(n log n) 平均 | O(log n) 棧 | 不穩定 |