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

C++数组按末位、首位排序问题求助(类冒泡排序)

问题分析与代码修正

核心问题点

  1. 排序循环逻辑错误:原代码内层循环访问A[j+1]时,j取N-1会超出数组下标范围,触发未定义行为;同时交换逻辑完全不符合排序规则,导致数组元素被错误覆盖。
  2. 比较函数语义模糊:checkNumber函数的返回值未明确对应排序时的交换条件,容易引发判断混淆。

修正后的代码

第一步:明确比较逻辑

重新定义shouldSwap函数,当a按规则应排在b之后时返回true(即需要交换两者位置):

#include <iostream>

// 判断a是否应该排在b的后面(需要交换a和b)
bool shouldSwap(int a, int b) {
    int lastA = a % 10;
    int firstA = a / 10; // 简洁获取两位数首位
    int lastB = b % 10;
    int firstB = b / 10;

    if (lastA != lastB) {
        return lastA > lastB; // 末位更大的元素应靠后,需交换
    } else {
        return firstA > firstB; // 末位相同时,首位更大的元素应靠后,需交换
    }
}

int main() {
    const int N = 10;
    int A[N] = {10,14,45,22,36,98,78,64,44,39};
    
    // 自定义规则的冒泡排序实现
    for (int i = 0; i < N - 1; i++) {
        for (int j = 0; j < N - 1 - i; j++) {
            if (shouldSwap(A[j], A[j+1])) {
                // 交换相邻元素
                int temp = A[j];
                A[j] = A[j+1];
                A[j+1] = temp;
            }
        }
    }

    // 输出排序结果
    for (int num : A) {
        std::cout << num << " ";
    }
    return 0;
}

代码说明

  1. 比较函数优化:用a / 10直接获取两位数的首位,逻辑简洁且与原代码一致;函数返回值明确对应交换条件,避免判断混淆。
  2. 正确的冒泡排序逻辑:外层循环控制排序轮数,内层循环遍历未排序的相邻元素,每一轮将当前未排序部分中“最大”(按自定义规则)的元素移到末尾,同时避免下标越界。
  3. 兼容性验证:针对示例数组{22,32,76,45,95,31,10,28,79,21},运行代码会输出预期结果10 21 31 22 32 45 95 76 28 79。

测试结果

输入数组{10,14,45,22,36,98,78,64,44,39},修正后输出为:
10 22 14 44 64 45 36 78 98 39,与预期完全一致。

内容的提问来源于stack exchange,提问作者duirel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:40:13