C语言快速排序中arr[i]与pivot交换异常问题求助
问题分析与修复
核心错误:错误的交换对象
你代码里最后一行的swap(&arr[i], &pvt);是无效的,因为pvt是一个局部变量,它只是存储了arr[high]的初始值,并不是数组元素的引用。交换这个局部变量和arr[i],只会改变局部变量pvt的值,完全不会修改原数组中原本存放pivot的位置(arr[high])。
正确的做法是交换arr[i]和arr[high]——因为pivot最初是从arr[high]取的,最终要把它放到分区后的正确位置i,所以直接操作数组的对应位置即可。
额外问题:缺少递归逻辑
你的quickSort函数只完成了一次分区,没有递归处理pivot左右两侧的子数组,这样无法完成整个数组的排序。需要在分区完成后,分别对左半部分(low到i-1)和右半部分(i+1到high)递归调用quickSort,同时要加递归终止条件(当low >= high时直接返回)。
修复后的完整代码
#include <stdio.h> void printArr(int arr[], int n) { for (int i = 0; i < n; i++) printf("%d ", arr[i]); printf("\n"); } void swap(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; } void quickSort(int arr[], int low, int high) { // 递归终止条件:区间无效或只有一个元素 if (low >= high) return; int pvt = arr[high]; int i = low; int j = high; while (i < j) { while (pvt > arr[i]) i++; while (pvt <= arr[j]) j--; if (i < j) swap(&arr[i], &arr[j]); } // 交换arr[i]和原pivot所在的arr[high] swap(&arr[i], &arr[high]); printArr(arr, high + 1); // 递归处理左半部分和右半部分 quickSort(arr, low, i - 1); quickSort(arr, i + 1, high); } int main() // 标准C中main的返回类型应为int { int arr[] = {10, 16, 8, 12, 15, 6, 3, 9, 5}; int n = sizeof(arr) / sizeof(arr[0]); quickSort(arr, 0, n - 1); return 0; }
修复说明
- 把
swap(&arr[i], &pvt);改为swap(&arr[i], &arr[high]);,确保修改的是数组中的元素,完成pivot的正确归位。 - 添加递归终止条件
if (low >= high) return;,避免无限递归。 - 在分区完成后,递归调用
quickSort处理左右子数组,完成整个排序流程。 - 修正
main函数的返回类型为int并添加return 0;,符合C语言标准。
内容的提问来源于stack exchange,提问作者Nirmal
相关产品推荐
相关产品推荐

