孤独叔叔 2021-11-17 16:25 采纳率: 60%
浏览 26
已结题

一个从大到小的选择排序结果不对,哪里错了

#include <stdio.h>
int main(){
int i,j,b;
int a[5]={2,4,1,5,3};
for(i=0;i<4;i++){
int max=a[i];
for(j=i+1;j<5;j++){
if(a[j])>max){
max=a[j];//找出每轮最大的数
b=j;//标记其位置
}
}
int c=a[i];
a[i]=a[b];
a[b]=c;//将每轮最大的数与目标位置的数交换
}
for(i=0;i<5;i++)
printf("%d ",a[i]);
return 0;
}

  • 写回答

2条回答 默认 最新

  • 浅笑临轩 2021-11-18 09:51
    关注

    你的代码只有找到最大数了才变更 b的下标,
    如果这个数本身就是最大数,b还是上次的下标,你下面依旧按已找到最大数去交换位置,当然错啦。
    我的改动为,每次外层循环把 i赋值给最大数下标(b),然后找到最大数后,判断 i和b不相等才交换位置。
    输出结果为5,4,3,2,1

    
    /** 测试类 */
    public static void main(String... args) {
    
        int i, j; //循环下标
        int b; //最大数的下标
        int[] a = new int[]{2, 4, 1, 5, 3};
        for (i = 0; i < a.length - 1; i++) {
            int max = a[i];
            b = i; //默认每次 i是最大数
            for (j = i + 1; j < a.length; j++) {
                if (a[j] > max) {
                    max = a[j]; //找出每轮最大的数
                    b = j;
                }
            }
            // 需要交换才做交换
            if(b != i) {
                int c = a[i];
                a[i] = a[b];
                a[b] = c;//将每轮最大的数与目标位置的数交换
            }
        }
        for (i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
    
        System.exit(0);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月26日
  • 已采纳回答 11月18日
  • 修改了问题 11月17日
  • 修改了问题 11月17日
  • 展开全部

悬赏问题

  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算
  • ¥15 powerbuilder中的datawindow数据整合到新的DataWindow
  • ¥20 有人知道这种图怎么画吗?
  • ¥15 pyqt6如何引用qrc文件加载里面的的资源
  • ¥15 安卓JNI项目使用lua上的问题