21 · 命令行参数与排序算法
命令行参数
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-文件读写