#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变置的作用域,看着不对