You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Нели Димитрова

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:01:20