2 weixin 41731967 weixin_41731967 于 2018.02.13 17:41 提问

学生成绩管理系统二维数组排序问题:如果不对总分排序那么全部顺序就不会改变为什么 10C

import java.util.*;
public class test5_18 {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner in=new Scanner(System.in);
    System.out.println("请输入学生的人数:");
    int pnum=in.nextInt();
    System.out.println("请输入课程数目:");
    int knum=in.nextInt();
    //存储学生姓名的数组
    String[] pname=new String[pnum];
    //存储课程的数组
    String[] kname=new String[knum];
    //二维数组总共pnum个学生,每个学生有knum门课程
    int[][]all=new int[pnum][knum];
    //总分数组
    int[] sum=new int[pnum];
    //平均分数组
    int[] avg=new int[pnum];
    //每个学生的分数信息字符串包括总分平均分
    String[] str=new String[pnum];
    for(int i=0;i<knum;i++){
        System.out.println("请输入第"+(i+1)+"门课程是什么:");
        kname[i]=in.next();
    }
    for(int i=0;i<pnum;i++){
        int t=0;
        String str1="";
        System.out.println("请输入第"+(i+1)+"个学生的姓名:");
        pname[i]=in.next();
        for(int j=0;j<knum;j++){
            System.out.println("请输入"+pname[i]+"的"+kname[j]+"的成绩:");
            all[i][j]=in.nextInt();
            t+=all[i][j];
            str1+=all[i][j]+"\t";
        }
        sum[i]=t;
        avg[i]=sum[i]/knum;
        str[i]=pname[i]+"\t"+str1+sum[i]+"\t"+avg[i];
    }
    for(int i=0;i<pname.length-1;i++){
        for(int j=0;j<pname.length-1;j++){
            if(sum[j]<sum[j+1]){
            /*如果不对总分排序那么全部顺序就不会改变为什么
                int t=sum[j+1];
                sum[j+1]=sum[j];
                sum[j]=t;   
                */
                //根据总分大小对字符串排序
                String t2=str[j+1]; 
                str[j+1]=str[j];
                str[j]=t2;
            }
        }
    }
    System.out.print("学生"+"\t");
    for(int i=0;i<kname.length;i++){
        System.out.print(kname[i]+"\t");
    }
    System.out.println("总分\t平均分\t排行榜");
    for(int i=0;i<pnum;i++){
        System.out.println(str[i]+"\t"+(i+1));
    }
}

}

5个回答

u013411118
u013411118   2018.02.13 18:20

是什么的全部顺序? 这个排序算法不对,可以去百度参考下冒泡排序。

weixin_40445305
weixin_40445305   2018.02.13 20:42

因为你不对总分进行排序,每次i++的遍历的数据都是一样的。其实就相当于只遍历了一次或0次。
如果你的分数是10,9,8,7,6这样的数组的话,那么每次遍历都是10,9,8,7,6,而这样的就不会进入if交换。
即使你的数不是有序的如1,5,9,2,7,3,这串数也不会变化,那么每次交换只发生在sum[j]<sum[j+1],而在下一次遍历当中,在上次交换了的位置就又会交换,变化为原来的样子。
所以当你i为偶数时就相当于遍历了0次,而奇数时就一次。
最后你这个排序法太冗余了,不好。

m0_37027994
m0_37027994   2018.02.13 21:39

你是按照总分排序的,根据总分的高低,改变代表相应学生各项成绩的字符串在数组中的位置,
如果你第一次比较,根据总分高低只改变了代表相应学生各项成绩的字符串在数组中的位置,而
不改变在总分数组中的位置,那么接下来每一次循环都是不对的,即使所有循环结束你的总分数组
也没有变

你的冒泡排序错了,正确如下:
for(int i=0;i<pname.length-1;i++){
for(int j=0;j<pname.length-1-i;j++){
if(sum[j]<sum[j+1]){
int t=sum[j+1];
sum[j+1]=sum[j];
sum[j]=t;

                    String t2=str[j+1]; 
                  str[j+1]=str[j];
                  str[j]=t2;
              }
        }

}

hxw_memory
hxw_memory   2018.02.13 23:23

百度是个好东西,,不懂可以跟他亲近亲近,,
for(int i=0;i<pname.length-1;i++){
for(int j=0;j<pname.length-1-i;j++){
if(sum[j]<sum[j+1]){
int t=sum[j+1];
sum[j+1]=sum[j];
sum[j]=t;

weixin_38291597
weixin_38291597   2018.02.14 18:19

因为你不对总分进行排序,每次i++的遍历的数据都是一样的。其实就相当于只遍历了一次或0次。
如果你的分数是10,9,8,7,6这样的数组的话,那么每次遍历都是10,9,8,7,6,而这样的就不会进入if交换。
即使你的数不是有序的如1,5,9,2,7,3,这串数也不会变化,那么每次交换只发生在sum[j]<sum[j+1],而在下一次遍历当中,在上次交换了的位置就又会交换,变化为原来的样子。
所以当你i为偶数时就相当于遍历了0次,而奇数时就一次。
最后你这个排序法太冗余了,不好。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!