C++数组按末位、首位排序问题求助(类冒泡排序)
问题分析与代码修正
核心问题点
- 排序循环逻辑错误:原代码内层循环访问
A[j+1]时,j取N-1会超出数组下标范围,触发未定义行为;同时交换逻辑完全不符合排序规则,导致数组元素被错误覆盖。 - 比较函数语义模糊:
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; }
代码说明
- 比较函数优化:用
a / 10直接获取两位数的首位,逻辑简洁且与原代码一致;函数返回值明确对应交换条件,避免判断混淆。 - 正确的冒泡排序逻辑:外层循环控制排序轮数,内层循环遍历未排序的相邻元素,每一轮将当前未排序部分中“最大”(按自定义规则)的元素移到末尾,同时避免下标越界。
- 兼容性验证:针对示例数组
{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
相关产品推荐
相关产品推荐

