21 · 命令行参数与排序算法

2026.09.27 · 🟡 中

命令行参数

int main(int argc, char *argv[]) {
    // argc:参数个数(含程序名本身)
    // argv:参数字符串数组,argv[0] 是程序名
    for (int i = 0; i < argc; i++)
        printf("argv[%d] = %s\n", i, argv[i]);
    return 0;
}
./app hello world
# argc=3
# argv[0]=./app  argv[1]=hello  argv[2]=world

⚠️ argv 是 char* 数组,数字参数要用 atoi() / strtol() 转换。等价写法 char **argv。

冒泡排序(最易懂,O(n²))

void bubbleSort(int *a, int n) {
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - 1 - i; j++)
            if (a[j] > a[j + 1]) {
                int t = a[j]; a[j] = a[j + 1]; a[j + 1] = t;
            }
}

选择排序 / 插入排序

void selectionSort(int *a, int n) {
    for (int i = 0; i < n - 1; i++) {
        int min = i;
        for (int j = i + 1; j < n; j++)
            if (a[j] < a[min]) min = j;
        int t = a[i]; a[i] = a[min]; a[min] = t;
    }
}

快速排序(分治,平均 O(n log n))

void quickSort(int *a, int lo, int hi) {
    if (lo >= hi) return;
    int p = a[(lo + hi) / 2], i = lo, j = hi;
    while (i <= j) {
        while (a[i] < p) i++;
        while (a[j] > p) j--;
        if (i <= j) { int t=a[i]; a[i]=a[j]; a[j]=t; i++; j--; }
    }
    quickSort(a, lo, j);
    quickSort(a, i, hi);
}

标准库排序(配合函数指针,见 10-函数指针与回调)

#include <stdlib.h>
int cmp(const void *a, const void *b) {
    return (*(int *)a) - (*(int *)b);   // 升序
}
int arr[] = {5, 2, 8, 1};
qsort(arr, 4, sizeof(int), cmp);

复杂度对照

算法 平均 最坏 稳定
冒泡 O(n²) O(n²) ✅
选择 O(n²) O(n²) ❌
插入 O(n²) O(n²) ✅
快速 O(n log n) O(n²) ❌

关联

08-数组 · 09-指针 · 10-函数指针与回调 · 15-文件读写