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

#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;
}

你的代码只有找到最大数了才变更 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);
}

b变置的作用域,看着不对