冒泡排序是最基礎的排序算法,通過重複遍歷數組,比較相鄰元素並交換,將大元素逐步「冒泡」到末尾。本文展示如何對字符串指針數組進行字典序排序。
#include <stdio.h>
#include <string.h>
void sort_strings(char *arr[], int n) {
int i, j;
char *temp;
// 外層控制遍歷輪數:n-1 輪
for (i = 0; i < n - 1; ++i) {
// 內層比較相鄰元素:每輪減少一次比較
for (j = 0; j < n - 1 - i; ++j) {
// strcmp > 0 表示前者字典序大於後者,需交換
if (strcmp(arr[j], arr[j + 1]) > 0) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void print_strings(char *arr[], int n) {
for (int i = 0; i < n; ++i) {
printf("%s ", arr[i]);
}
printf("\n");
}
int main() {
char *words[] = {"ceo", "define", "basic", "abc", "empty"};
int n = sizeof(words) / sizeof(words[0]);
printf("原序列: ");
print_strings(words, n);
sort_strings(words, n);
printf("排序後: ");
print_strings(words, n);
return 0;
}
原序列: ceo define basic abc empty 排序後: abc basic ceo define empty
char *arr[] 是指針數組,每個元素指向一個字符串常量。排序時交換的是指針,而非複製字符串內容,效率極高。strcmp(s1, s2) 返回值:
j < n - 1 - i,因為每輪結束後最大的元素已沉底,無需再比較。| 指標 | 數值 |
|---|---|
| 時間複雜度 (平均/最壞) | O(n²) |
| 時間複雜度 (最佳,已有序) | O(n) - 可加旗標檢測無交換則提前結束 |
| 空間複雜度 | O(1) |
void sort_strings_optimized(char *arr[], int n) {
int i, j;
char *temp;
int swapped;
for (i = 0; i < n - 1; ++i) {
swapped = 0;
for (j = 0; j < n - 1 - i; ++j) {
if (strcmp(arr[j], arr[j + 1]) > 0) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = 1;
}
}
if (!swapped) break; // 本輪無交換,已有序
}
}
實際工程中,對於小規模數據 (n < 50) 冒泡排序代碼簡單且無額外開銷可接受;大規模數據請使用 qsort (快速排序) 或 C++ std::sort。