public class ArrayDemo06
{
public static void main(String args[])
{
int score[] = { 67, 89, 87, 69, 90, 100, 75 }; // 使用静态初始化声明数组
for (int i = 0; i <=score.length-1; i++)
{
for (int j = 0; j <= score.length-1; j++)
{
if (score[i] < score[j])
{ // 交换位置
int temp = score[i]; // 中间变量
score[i] = score[j];
score[j] = temp;
}
}
}
for (int i = 0; i <= score.length-1; i++)
{ // 循环输出
System.out.print(score[i] + "\t");
}
}
}
对这道程序,我一看完还不知道是从小到大,还是从大到小的顺序排序?从哪里可以看出,能说下详细的执行过程吗?请大家指点,这样的问题虽然是老生常谈了,但我一直就这样含糊过来的,悲啊!

解决方案 »

  1.   

    if (score[i] < score[j])
    { // 交换位置
    ==>你这是把小的换到后面去了  所以是从大到小了
    能说下详细的执行过程你自己手动的执行一次,画出每一遍的图,就知道过程了,想不出来,就画出来,
      

  2.   

    这是从大到小的排序,第一个循环比较第一个元素和其他的元素
    如果第一个元素score[i] 小于他后面的元素score[j], 那么就把score[i]和score[j]的位置交换
    交换的步骤是 先把score[i]赋值给temp,再把score[i]赋值给score[i],最后把temp里的以前的score[i]的值给score[j]temp <- score[i]; score[i] <- score[j]; score[j] <- temp;
      

  3.   

    楼主应该多花点时间学习Java基础~~
      

  4.   

    这就是一个选择排序的过程:
    让第一个元素与这个数组中的所以元素比较然后符合条件的互换。接着对第二个元素做同样的事情....直到i>score.length-1就是这么一个排序的过程,楼主慢慢理会。
      

  5.   

        public static void main(String[] args) {
            int[] d = {52,34,11,68,2,44};
            for(int i = 0 ;i<d.length-1;i++){
                for(int j= i+1;j<d.length;j++){
                    if(d[i]<d[j]){
                        int t = d[i];
                        d[i] = d[j];
                        d[j] = t;
                    }
                }
            }
            for(int l:d){
                System.out.println(l);
            }
        }看看这个 容易理解 冒泡 的思想
    你写的循环不对 不适合理解
      

  6.   

    public class ArrayDemo06
    {
    public static void main(String args[])
    {
    int score[] = { 67, 89, 87, 69, 90, 100, 75 }; // 使用静态初始化声明数组
    for (int i = 0; i <=score.length-1; i++)
    {
    for (int j = i+1; j <= score.length-1; j++)
    {
    if (score[i] < score[j])
    { // 交换位置
    int temp = score[i]; // 中间变量
    score[i] = score[j];
    score[j] = temp;
    }
    }
    }
    for (int i = 0; i <= score.length-1; i++)
    { // 循环输出
    System.out.print(score[i] + "\t");
    }
    }
    }
    这是怎么样的.....................................
    我上面的回答错了
      

  7.   

    这个是冒泡排序的另一种变形算法思路:从双层for循环及if条件和每次都进行元素的交换来看,你已经可以确定为这是一种冒泡排序性质的算法,冒泡是最最最简单的算法,也是最容易被变形和改进的算法,从这里你已经可以可以看出每次排序都是在查找最大值,而这个最大值的位置是从位置0一直往高处前进,而并不是一下子提升到最末,这也就是为什么很多人认为这是一个从大到小的排序过程,大家不仔细看算法,只因一个if条件就匆匆认为是从大到小的排序,不知道这个i的值每次都在++,所以最大值的位置每次都在变,这个就是一个小水泡在升华的过程。
    在这里插播科普知识一条: 袁承志知道若再谦逊,那就是瞧人不起,展开五行拳,发拳当胸打去。荣彩和旁观三人本来都以为他武功有独到之秘,哪知使出来的竟是武林中最寻常不过的五行拳。敌对三人登时意存轻视,温青脸上不自禁露出失望的神色。“荣彩心中暗喜,双拳如风,连抢三下攻势,满拟自己的大力魔爪手江南独步,三四招之间就可破去对方五行拳,那知袁承志轻描淡写的一一化解。再拆数招,荣彩暗暗吃惊,原来对方所使虽是极寻常的拳术,但每一招均是含劲不吐,意在拳先,举手抬足之间隐含极浑厚的内力。
      

  8.   

    for (int j = 0; j <= score.length-1; j++)这样不好吧,浪费比较次数啊,应该是
    for (int j = 0; j <= score.length-i; j++)
    把1改成i
      

  9.   

    如果内循环是j=0的话就是从小到大
    如果内循环是j=i的话就是从大到小
      

  10.   

    主要看第i个的变化,每次比较,i会暂时存储相对较大的数,例如,外层第一次循环的第一次比较i暂时89,后面如果有更大的数,89就会被交换下去,也就是说所有大的数是往后移动,最终第i个保存的是100。最后一次循环最后一个也当然就是100了。整个过程就是大数不断往后移(除了100,100是跟着i往后移动的)~~所以是小到大
    这个过程比冒泡还要耗时N*N
    ,,服了写这个程序的人。。随便改成较正常的冒泡,供对比。。
    public class ArrayDemo06
    {
    public static void main(String args[])
    {
    int score[] = { 67, 89, 87, 69, 90, 100, 75 }; // 使用静态初始化声明数组
    for (int i = 0; i <=score.length-1; i++)
    {
    for (int j = 0; j < score.length-1-i; j++)
    {
    if (score[j] < score[j+1])
    { // 交换位置
    int temp = score[j]; // 中间变量
    score[j] = score[j+1];
    score[j+1] = temp;
    }
    }
    }
    for (int i = 0; i <= score.length-1; i++)
    { // 循环输出
    System.out.print(score[i] + "\t");
    }
    }
    }
      

  11.   

    这个程序有点邪恶了。 就像上面的朋友说的,int j=i+1;时是从大到小,其思路是逐一确定各位置的最大值。而int j=0;时则是从小到大,因为比较过程中是数组是动态变化的,不断把大数移动到后面。这个程序耗时且不易读,完全是迷惑人的。
      

  12.   

    大哥,你DEBUG跟踪一下不就知道了么,这种问题最好别在论坛里来问。
      

  13.   

    lao nian meiyou lai le,lai kankan
      

  14.   

    楼主你这里用的冒泡排序
    应该是j=i+1;
    看交换那里
    如果是<交换      就是从达到小
    如果是>交换      祭师从小到大
    我也是刚学java
    努力吧
    自学万岁...........public class Circle {
    public static void main(String args[]) {
    int score[] = { 67, 89, 87, 69, 90, 100, 75 }; // 使用静态初始化声明数组
    for (int i = 0; i <= score.length - 1; i++) {
    for (int j = i+1; j <= score.length - 1; j++) {
    if (score[i] < score[j]) { // 交换位置
    int temp = score[i]; // 中间变量
    score[i] = score[j];
    score[j] = temp;
    }
    }
    }
    for (int i = 0; i <= score.length - 1; i++) { // 循环输出
    System.out.print(score[i] + "\t");
    }
    }
    }
      

  15.   

    确实是容易忽悠人的一个循环。关键是i每自加一次都要与所有数组元素依次比较,然后找出最大值保存到i,也就是说i自始至终存放的都是最大值100,当i自加到最后一个位置时,也就是score[6]=100了。如将内循环 j = i ,就会变成从大到小排序了!