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

C语言按绝对值升序排序数组但保留原数值的实现问题

问题解决:按绝对值升序排序并保留原数值

原代码核心问题

  • 直接修改原数组元素:将负数转为正数覆盖原值,导致排序后丢失符号信息
  • 循环嵌套逻辑错误:处理绝对值的循环与排序循环嵌套,导致排序执行混乱

修正后的代码

#include <stdio.h>
#define N 10

// 计算整数绝对值的辅助函数
int abs_val(int num) {
    return num < 0 ? -num : num;
}

int main() {
    int array[N];
    int i, j, min_idx;

    // 读取输入数组
    for (i = 0; i < N; i++) {
        scanf("%d", &array[i]);
    }

    // 选择排序:按绝对值升序,保留原数值
    for (i = 0; i < N - 1; i++) {
        min_idx = i;
        // 寻找当前未排序段中绝对值最小的元素下标
        for (j = i + 1; j < N; j++) {
            if (abs_val(array[j]) < abs_val(array[min_idx])) {
                min_idx = j;
            }
        }
        // 交换当前位置与最小绝对值元素的位置
        if (min_idx != i) {
            int temp = array[i];
            array[i] = array[min_idx];
            array[min_idx] = temp;
        }
    }

    // 输出排序结果
    for (i = 0; i < N; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");

    return 0;
}

关键修改说明

  • 新增abs_val函数:专门计算绝对值,避免直接修改原数组元素
  • 排序时比较元素绝对值:将排序判断条件改为对比元素的绝对值大小,而非元素本身
  • 移除原值修改逻辑:保留所有输入元素的原始符号,仅调整元素位置
  • 修复循环嵌套错误:将排序逻辑独立,确保排序流程正确执行

测试输入:54 -2 6 0 82 59 22 1 -654 -21
测试输出:0 1 -2 6 -21 22 54 59 82 -654,完全符合期望结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:01:03