首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言指針數組排序字符串:qsort 與冒泡排序實戰

     編輯:C 語言問答

利用指針數組實現字符串排序的兩種經典方法

在 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;
}

方法二:標準庫 qsort(工程推薦)

#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]

關鍵點總結

  • 二維數組 vs 指針數組:char str[5][20] 分配連續內存存字符;char *p[5] 只存地址
  • strcmp 返回值:<0 表示前者小,=0 相等,>0 表示前者大
  • 排序穩定性:冒泡排序穩定,qsort 不保證穩定
  • 時間複雜度:冒泡 O(n²),qsort 平均 O(n log n)
  • 實際開發建議:優先使用 qsort,代碼更簡潔、性能更優

進階:動態分配版本

若字符串數量和長度不固定,可結合 malloc/free 實現完全動態的字符串排序系統。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved