commit 4412ac3a37c91b28a9f01122d64c7ad4791f9607 Author: flykhan Date: Fri Jul 7 10:15:59 2023 +0800 快速排序 diff --git a/quick_sort.c b/quick_sort.c new file mode 100644 index 0000000..1626090 --- /dev/null +++ b/quick_sort.c @@ -0,0 +1,61 @@ +#include +int a[101], n; // 定义全局变量,这两个变量需要在子函数中使用 + +void quicksort(int left, int right) +{ + int i, j, temp; // 定义局部变量 + if (left > right) + return; // 结束递归 + + temp = a[left]; // temp中存的就是基准数 + i = left; // i中存的就是左边的坐标,最左边的坐标就是基准数的坐标 + j = right; // j中存的就是右边的坐标 + while (i != j) + { + + // 找到右边小于基准数的数 + // 顺序很重要,要先从右边开始找 + while (a[j] >= temp && i < j) + j--; + // 找到左边大于基准数的数 + // 再从左往右边找 + while (a[i] <= temp && i < j) + i++; + + // 当左右两边的数都找到,而且没有重合时,交换两个数在数组中的位置 + if (i < j) + { + // 使用异或运算交换两个数 + a[i] = a[i] ^ a[j]; + a[j] = a[i] ^ a[j]; + a[i] = a[i] ^ a[j]; + } + } + + // 最终将基准数归位 + a[left] = a[i]; + a[i] = temp; + + quicksort(left, i - 1); // 继续处理左边的,这里是一个递归的过程 + quicksort(i + 1, right); // 继续处理右边的,这里是一个递归的过程 +} + +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\t", a[i]); + + getchar(); + getchar(); + + return 0; +} \ No newline at end of file