快速排序代码无输出求助:单独index函数正常,集成后无输出
快速排序无输出问题排查与修复
我来帮你搞定这个问题!你的代码之所以没输出,是因为quickSort函数陷入了无限递归,程序根本没机会走到main函数里的输出循环。咱们一步步拆解问题:
核心问题1:分区函数返回值错误
你的index函数负责找到pivot元素的正确位置,但最后返回的start是错误的——它指向的是pivot位置的下一个索引,而我们需要返回pivot本身的索引。
看一下逻辑:当循环遍历到最后一个元素(也就是pivot自己)时,肯定满足a[i] <= piv的条件,这会触发交换并让start自增1。循环结束后,start已经跳到了第一个大于pivot的元素位置,所以正确的pivot索引应该是start - 1。
修正后的index函数:
int index(int* a, int s, int e) { int i, start, piv, temp; start = s; piv = a[e]; for (i = start; i <= e; i++) { if (a[i] <= piv) { temp = a[i]; a[i] = a[start]; a[start] = temp; start++; } } return start - 1; // 这里是关键修正 }
核心问题2:无限递归导致程序卡死
因为index返回了错误的start值(比如对于长度为8的数组,返回值会是8),你在quickSort里调用quickSort(a, s, pivot - 1)时,pivot - 1就等于7,和最初的调用quickSort(A, 0, 7)完全一致。这就导致函数无限重复调用自己,程序一直卡在递归栈里,永远执行不到后面的输出代码。
当修正index的返回值后,递归的边界就正常了:每次把数组分成pivot左侧(s到pivot-1)和右侧(pivot+1到e)的子数组,直到子数组长度为1时停止递归。
完整修正代码
#include <iostream> using namespace std; int index(int* a, int s, int e) { int i, start, piv, temp; start = s; piv = a[e]; for (i = start; i <= e; i++) { if (a[i] <= piv) { temp = a[i]; a[i] = a[start]; a[start] = temp; start++; } } return start - 1; } void quickSort(int* a, int s, int e) { int pivot; if (s < e) { pivot = index(a, s, e); quickSort(a, s, pivot - 1); quickSort(a, pivot + 1, e); } } int main() { int A[] = {2, 5, 8, 3, 6, 9, 1, 4}; quickSort(A, 0, 7); // 加空格让输出更易读 for (int i = 0; i < 8; i++) { cout << A[i] << " "; } return 0; }
运行这段代码后,预期输出是:1 2 3 4 5 6 8 9
内容的提问来源于stack exchange,提问作者Nair Deepesh
相关产品推荐
相关产品推荐

