C语言整数数组快速排序问题:代码未实现预期排序的求助
问题排查与修复:C语言快速排序函数无效问题
核心问题分析
你的代码存在三个关键错误,导致排序完全失效:
1. swap 函数逻辑错误
原swap函数仅交换了指针变量本身的地址,并未修改指针指向的实际数组元素值。调用该函数后数组不会产生任何变化。
2. partition 函数未完成枢轴归位
划分过程结束后,没有将枢轴元素放到它最终的正确位置(所有小于它的元素右侧、大于它的元素左侧),导致枢轴位置始终错误,递归无法正确分割数组。
3. partition 返回值与递归范围不匹配
原partition返回的i是第一个大于枢轴的元素位置,但递归时直接使用该值分割数组,导致区间划分错误,部分元素从未被排序。
修复后的完整代码
#include <stdlib.h> #include <stdio.h> void print_arr(int arr[], int lon) { for (int i = 0; i < lon; i++) { printf("%d ", arr[i]); } } // 修复swap函数:交换指针指向的实际元素值 void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int partition(int arr[], int low, int high) { int pivote = arr[low]; int i = low + 1; for (int j = i; j < high; j++) { // 升序排序规则:将小于枢轴的元素移到左侧 if (arr[j] < pivote) { swap(&arr[i], &arr[j]); i++; } } // 将枢轴元素放到正确位置:i-1是最后一个小于枢轴的元素下标 swap(&arr[low], &arr[i-1]); // 返回枢轴的最终位置 return i - 1; } void quicksort(int arr[], int low, int high) { if (low < high) { int pi = partition(arr, low, high); // 递归排序枢轴左侧和右侧的子数组 quicksort(arr, low, pi); quicksort(arr, pi + 1, high); } } int main() { int arr[5] = {3, 4, 1, 2, 5}; quicksort(arr, 0, 5); print_arr(arr, 5); puts(""); return 0; }
关键修复点说明
swap函数修复:把指针地址交换改为对指针指向的int值进行交换,确保数组元素实际被调换。partition函数补充枢轴归位:遍历结束后,将枢轴从初始的low位置交换到i-1位置,此时i-1就是枢轴在有序数组中的正确位置。- 调整递归范围:左侧递归范围改为
[low, pi](pi是枢轴最终位置,无需再排序),右侧为[pi+1, high],确保所有子数组都被正确处理。
运行修复后的代码,输出将符合预期:1 2 3 4 5
内容的提问来源于stack exchange,提问作者Casta
相关产品推荐
相关产品推荐

