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
相关产品推荐
相关产品推荐

