张铎龙 2019-11-06 13:24 采纳率: 33.3%
浏览 285

一道关于C++ 绝对值排序的问题,我的代码的运行结果满足绝大多数情况的输出,对一些特殊情况出错,但并未查明其原因,请高手指点

图片说明

#include<stdio.h>
using namespace std;
int main(){
    int n,line[100],line_0[100],temp;
    while(scanf("%d",&n)){
        if(n==0){
            return 0;
        }
        for(int i=0;i<n;i++){
            scanf("%d",&line[i]);
        }
        for(int i=0;i<n;i++){
            line_0[i]=line[i];
        }
        for(int i=0;i<n;i++){
            if(line_0[i]<0) line_0[i]=-line_0[i];
        }
        for(int i=1;i<n;i++){
            for(int j=0;j<i;j++){
                if(line_0[j]<line_0[j+1]){
                    temp=line[j];
                    line[j]=line[j+1];
                    line[j+1]=temp;
                    temp=line_0[j];
                    line_0[j]=line_0[j+1];
                    line_0[j+1]=temp;
                }
            }
        }
        for(int i=0;i<n-1;i++){
            printf("%d ",line[i]);
        }
        printf("%d\n",line[n-1]);
    }
    return 0;
}

不知道这段代码哪里有问题,无法对4 0 1 2 -3正确操作进行排序,请高手指点
补充:我的思路是创建两个一样的数组line[100]与line_0[100],操作line_0[100],使其中所有的负数变成正数,然后对line_0[100]进行冒泡排序,同时将line_0[100]中元素的位置移动的操作附加到原数组上,从而实现排序

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-29 20:11
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    你的代码在遇到负数时没有正确地转换它们到正数,并且在进行冒泡排序时也没有考虑到负数可能带来的影响。

    正确的做法是在遍历数组时检查当前元素是否为负数,如果是,则将其转换为正数并交换位置。此外,在进行冒泡排序时,可以先比较相邻元素的绝对值,如果前一个元素的绝对值大于后一个元素的绝对值,则交换这两个元素的位置。

    下面是修改后的代码:

    #include <stdio.h>
    
    void swap(int *x, int *y) {
        int t = *x;
        *x = *y;
        *y = t;
    }
    
    int main() {
        int n, line[100], line_0[100], temp;
    
        while (scanf("%d", &n) == 1 && n != 0) {
            if (n == 0) break;
    
            for (int i = 0; i < n; ++i) {
                scanf("%d", &line[i]);
            }
    
            // 将负数转换为正数
            for (int i = 0; i < n; ++i) {
                if (line[i] < 0) {
                    line[i] = -line[i];
                }
            }
    
            // 冒泡排序
            for (int i = 0; i < n - 1; ++i) {
                for (int j = 0; j < n - i - 1; ++j) {
                    if (abs(line[j]) > abs(line[j + 1])) {
                        swap(&line[j], &line[j + 1]);
                    }
                }
            }
    
            // 输出结果
            for (int i = 0; i < n; ++i) {
                printf("%d ", line[i]);
            }
            printf("\n");
    
            // 清除临时变量
            memset(line, 0, sizeof(line));
            memset(line_0, 0, sizeof(line_0));
        }
    
        return 0;
    }
    

    这个版本的代码应该能够正确地解决您的问题。

    评论

报告相同问题?