diff --git a/chapter1/quick_sort.c b/chapter1/quick_sort.c new file mode 100644 index 0000000..7dd0150 --- /dev/null +++ b/chapter1/quick_sort.c @@ -0,0 +1,58 @@ +// 快速排序 +// 平均时间复杂度: O(NlogN) - 最差时间复杂度: O(N^2) +#include +int a[101], n; // 定义全局变量,这两个变量需要在子函数中使用 + +void quicksort(int left, int right) +{ + int i, j, t, temp; + if (left > right) + return; + + temp = a[left]; // temp 中存的就是基准数 + i = left; + j = right; + while (i != j) + { + // 顺序很重要,要先从右往左找 + while (a[j] >= temp && i < j) + j--; + + // 在从左往右找 + while (a[i] <= temp && i < j) + i++; + + if (i < j) + { + t = a[i]; + a[i] = a[j]; + a[j] = t; + } + } + + // 最终将基准数归位 (交换基准数和 i 位置当前值) + a[left] = a[i]; + a[i] = temp; // temp 在上面有定义 + + quicksort(left, i - 1); // 继续处理左边的,这里是一个递归的过程 + quicksort(i + 1, right); // 继续处理右边的 + return; +} + +int main() +{ + int i, j; + // 读入数据 + scanf("%d", &n); + for (i = 1; i <= n; i++) + scanf("%d", &a[i]); + + quicksort(1, n); // 快速排序调用 + + // 输出排序后的结果 + for (i = 1; i <= n; i++) + printf("%d ", a[i]); + printf("\n"); + + return 0; +} \ No newline at end of file