C++动态城市对象数组快速排序功能异常问题排查
快速排序失效的问题分析与修复方案
嘿,我仔细检查了你的代码,发现quicksort方法里有几个致命错误,导致排序完全没按预期执行。咱们一步步来解决:
1. 精度丢失的pivot问题
你用int pivot来接收getDaljina()返回的double类型经度,这会直接把小数部分砍掉!比如经度是27.9的城市,pivot会变成27,和其他带小数的经度比较时逻辑全乱了,这是最核心的问题之一。
2. 外层循环条件完全错误
原代码的while (left < j || i < right)完全不符合快速排序的逻辑,咱们要的是让左右指针i和j相向移动,直到它们交叉,所以正确的外层循环条件应该是while (i <= j)。
3. 右指针的比较对象写错了
第二个while循环里你写成了bulgaria[i].getDaljina()>pivot,这明显是笔误啊!咱们要移动的是右指针j,所以应该比较bulgaria[j].getDaljina()才对。
4. 递归逻辑混乱
原代码在循环里的else分支直接递归并return,这会导致部分数组根本没被递归到。正确的做法是等左右指针交叉(i>j)后,再分别对左半段(left到j)和右半段(i到right)递归排序。
修复后的完整quicksort代码
void city::quicksort(city bulgaria[], int left, int right) { int i = left; int j = right; // 用double类型接收pivot,保留经度的小数精度 double pivot = bulgaria[(left + right) / 2].getDaljina(); // 正确的外层循环:让i和j相向移动直到交叉 while (i <= j) { // 左指针向右找第一个大于等于pivot的元素 while (bulgaria[i].getDaljina() < pivot) i++; // 右指针向左找第一个小于等于pivot的元素 while (bulgaria[j].getDaljina() > pivot) j--; // 如果指针还没交叉,交换元素并移动指针 if (i <= j) { city temp = bulgaria[i]; bulgaria[i] = bulgaria[j]; bulgaria[j] = temp; i++; j--; } } // 循环结束后,递归处理左右两个子数组 if (left < j) quicksort(bulgaria, left, j); if (i < right) quicksort(bulgaria, i, right); }
额外的小建议
- 把
quicksort改成静态成员函数会更合理,因为它操作的是整个城市数组,不需要依赖某个具体的city对象。修改类声明:static void quicksort(city bulgaria[], int left, int right);,然后调用的时候直接写city::quicksort(bulgaria, 0, n-1);,比用bulgaria[i].quicksort(...)逻辑更清晰。 - 你现在的默认构造函数每次创建对象都会弹出输入提示,如果后续需要创建空的
city对象,可以重载一个无操作的默认构造函数,比如city() = default;,这样更灵活。
内容的提问来源于stack exchange,提问作者Нели Димитрова
相关产品推荐
相关产品推荐

