这段C++快速排序代码存在什么问题?需如何修正?
快速排序代码的修正方案
你的代码存在多处逻辑错误,以下是具体问题和修正方式:
外层循环条件完全错误
原代码中while(i<pivot && j>pivot)是把索引值和基准值做比较,完全不符合快速排序的分区逻辑。正确的条件应该是while(i <= j),用于控制i和j向中间移动,直到二者交叉。内层循环缺失越界检查
原代码里的while(a[i]<=pivot)和while(a[j]>pivot)没有判断索引是否超出数组范围,会导致数组越界访问。修正后应为:while(i <= high && a[i] <= pivot)while(j >= low && a[j] > pivot)分区与递归的执行逻辑错误
原代码将基准值归位和递归调用的代码放在if(i<j)分支内,这会导致当i和j交叉时,基准值无法回到正确位置,递归也不会触发。正确的做法是:在完成i和j的移动后,不管是否交换过元素,都要把基准值(原low位置的元素)和j位置的元素交换,再递归处理左右子数组。函数返回值不匹配
函数f声明为int类型,但内部没有任何返回语句,属于未定义行为。应将返回类型改为void。外层循环的执行逻辑错误
原外层while只执行一次内层循环就退出,正确逻辑是:在内层找到需要交换的i和j后,交换二者指向的元素,然后继续移动i和j,直到i>j。
修正后的完整代码:
#include <iostream> using namespace std; void f(int a[], int low, int high) { int pivot, i, j, t; if (low < high) { pivot = a[low]; i = low + 1; j = high; while (i <= j) { // 找到第一个大于pivot的元素 while (i <= high && a[i] <= pivot) { i++; } // 找到第一个小于等于pivot的元素 while (j >= low && a[j] > pivot) { j--; } // 若i还在j左边,交换元素 if (i < j) { t = a[i]; a[i] = a[j]; a[j] = t; } } // 将基准值放到正确的位置 a[low] = a[j]; a[j] = pivot; // 递归处理左右子数组 f(a, low, j - 1); f(a, j + 1, high); } } int main() { int a[100], i, n, low, high; cout << "Enter size of array" << endl; cin >> n; cout << "Enter elements in array" << endl; for (i = 0; i < n; i++) { cin >> a[i]; } low = 0; high = n - 1; f(a, low, high); cout << "Sorted array:" << endl; for (i = 0; i < n; i++) { cout << a[i] << " "; } return 0; }
内容的提问来源于stack exchange,提问作者IronicRayquaza
相关产品推荐
相关产品推荐

