定第一个元素为中间值然后一直分两半递归#includestdio.h#includestdlib.hint n, a[105]; // n 为数组元素个数a 为待排序数组下标从 1 开始/** 快速排序函数* 参数a[] - 待排序数组* l - 左边界起始下标* r - 右边界结束下标* 空间复杂度O(logn)递归栈深度* 稳定性不稳定* 平均时间复杂度O(nlogn)* 最坏时间复杂度O(n^2)当数组已经有序或逆序时*/void Qsort(int a[], int l, int r){int p; // 基准值if (l r) // 当区间长度大于1时才需要排序{int i l, j r;p a[l]; // 选取当前区间第一个元素作为基准值while (i j) // 当左右指针未相遇时{// 从右向左扫描找到第一个小于基准值的元素while (i j a[j] p) j--;if (i j) // 找到后放入左边的空位{a[i] a[j];i; // 左指针右移一位}// 从左向右扫描找到第一个大于基准值的元素while (i j a[i] p) i;if (i j) // 找到后放入右边的空位{a[j] a[i];j--; // 右指针左移一位}}// 循环结束时 i j即为基准值的最终位置a[i] p;// 递归处理基准值左边的子区间Qsort(a, l, i - 1);// 递归处理基准值右边的子区间Qsort(a, i 1, r);}}int main(){// 输入元素个数scanf(%d, n);// 输入数组元素下标从 1 开始for (int i 1; i n; i){scanf(%d, a[i]);}// 调用快速排序Qsort(a, 1, n);// 输出排序后的数组for (int i 1; i n; i){printf(%d , a[i]);}printf(\n);return 0;}