A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴扬 中级黑马   /  2012-6-19 20:04  /  2357 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 吴扬 于 2012-6-20 00:03 编辑

初学者,自己尝试着写了下冒泡排序的算法,但是还是出现了一点问题

  1. public class BubbleSort {

  2. public static void main(String[] args) {
  3. int[] arr = new int[]{5,3,2,6,12,10,9,11};
  4.                 bubbleSort(arr);
  5.                 for(int i =0; i < arr.length; i++)
  6.                 {
  7.                         System.out.print(arr[i]+" ");
  8.                 }
  9.         }
  10.        
  11.         public static void bubbleSort(int[] arr)
  12.         {
  13.                 for(int i = 0; i < arr.length; i++)
  14.                 {
  15.                         for(int j = i; j < arr.length-1; j++)  //这里j的初始值应该是0,而不是i
  16.           {
  17.                                 if(arr[j] > arr[j+1])
  18.                                 {
  19.                                         int temp = arr[j];
  20.                                         arr[j] = arr[j+1];
  21.                                         arr[j+1] = temp;
  22.                                 }
  23.                         }
  24.                 }
  25.         }

  26. }
复制代码
程序运行之后的结果是3 2 5 6 9 10 11 12,后面发现是自己在第二层循环的时候j的初始值错了,应该是从0开始
为什么如果j的初始值是i的话就会出现上面的运行结果呢?

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

13 个回复

倒序浏览
本帖最后由 余银桂 于 2012-6-19 20:24 编辑

如果j的初始值是i的话第一次内层循环结束的时候,3已经排到第一位了
但是第一次内层循环结束的时候,由于i自增了
而此时3的角标是0,i自增之后从1开始
所以此时3就没有参内层循环的比较
没有参加内存循环的比较

帮楼主改了一下,供参考
  1. public static void main(String[] args) {

  2. int[] arr = new int[]{5,3,2,6,12,10,9,11};

  3.                 bubbleSort(arr);

  4.                for(int i =0; i < arr.length; i++)

  5.                 {

  6.                        System.out.print(arr[i]+" ");

  7.                }

  8.         }

  9.       

  10.         public static void bubbleSort(int[] arr)

  11.         {

  12.                for(int i = 0; i < arr.length-1; i++)

  13.                 {

  14.                         for(int j = i; j < arr.length; j++)  //这里j的初始值应该是0,而不是i

  15.          {

  16.                                 if(arr[i] > arr[j])

  17.                                 {

  18.                                        int temp = arr[i];

  19.                                        arr[i] = arr[j];

  20.                                       arr[j] = temp;

  21.                                 }

  22.                         }

  23.                }

  24.        }



  25. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
int temp,i,j;
for(i=0;i<a.length;i++)       //一共要做a.length趟,每趟保证可一把最大的数放到最后
for(j=0;j<a.length-i-1;j++)        //每趟将从0~a.length-i-1之间每两个数相互比较,共比较a.length-i次
{
}
回复 使用道具 举报
j=i;  外部循环每循环一次,j的值都不一样。第一次是0,第二次是1,第三次2........
回复 使用道具 举报

  1. public class BubbleSort {

  2. public static void main(String[] args) {
  3.               int[] arr = new int[]{5,3,2,6,12,10,9,11};
  4.                 bubbleSort(arr);
  5.                 for(int i =0; i < arr.length; i++)
  6.                 {
  7.                         System.out.print(arr[i]+" ");
  8.                 }
  9.         }
  10.         
  11.         public static void bubbleSort(int[] arr)//这才是冒泡排序
  12.         {
  13.                 for(int i = 0; i < arr.length; i++)
  14.                 {
  15.                         for(int j =0; j < arr.length-i-1; j++)  
  16.                         {
  17.                                 if(arr[j] > arr[j+1])
  18.                                 {
  19.                                         int temp = arr[j];
  20.                                         arr[j] = arr[j+1];
  21.                                         arr[j+1] = temp;
  22.                                 }
  23.                         }
  24.                 }
  25.         }

  26. }
复制代码
回复 使用道具 举报
D:\1111.jpg
这是运行的结果出现过程,他每次都是从自身开始往后比较。

1111.jpg (7.15 KB, 下载次数: 37)

1111.jpg
回复 使用道具 举报
public class diyitian {

       
        public static void main(String[] args)
        {
        int[] arr = new int[]{5,3,2,6,12,10,9,11};
    bubbleSort(arr);
    for(int i =0; i < arr.length; i++)
    {
            System.out.print(arr[i]+" ");
    }
}

public static void bubbleSort(int[] arr)
{
    for(int i = 0; i < arr.length-1; i++)
    {
            for(int j = 0; j < arr.length-1; j++)  //这里j的值是0,不是j=i,结果错误。j=0后就排序正确。

                    if(arr[j] > arr[j+1])
                    {
                            int temp = arr[j];
                            arr[j] = arr[j+1];
                            arr[j+1] = temp;
                    }
            }
    }
}

}

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 新手鼓励一下~

查看全部评分

回复 使用道具 举报
王月 中级黑马 2012-6-19 20:40:49
8#
本帖最后由 王月 于 2012-6-19 20:44 编辑

因为外循环控制的是整体循环的次数内循环控制比较的次数,如果内循环for(int j = i; j < arr.length-1; j++) 这样写,
那么第二次循环就是从arr[1]和arr[2]开始比的,把arr[0]忽略了,所以循环结束后 3 肯定在首位置,因为他就参加了一次比较。

还有建议LZ把内循环中 j 的取值范围这样写,j<arr.length-1-i;可以减少比较的次数,提高效率,但是结果还是正确的。
LZ再理解一下冒泡排序的原理
在冒泡排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以每一轮循环后,会得到这一轮的最大数,从后向前从大到小排序。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
李伟 中级黑马 2012-6-19 20:44:44
9#
        public static void bubbleSort(int[] arr)
        {
                for(int i = 0; 改成i < arr.length-1; i++)//[b]这个是外循环,冒泡排序是相邻两个元素比较,循环次数是arr.length-1,应改成i<arr.length-1
             {
                        for(int j = i; 改成j < arr.length-1-i; j++)  //这里j的初始值应该是0,而不是i//这个是内循环,每次都要从0角标开始比较,所以是0
                       {
                                if(arr[j] > arr[j+1])
                                {
                                        int temp = arr[j];
                                        arr[j] = arr[j+1];
                                        arr[j+1] = temp;
                                }
                        }
                }
        }

}
回复 使用道具 举报

          public static void sort(long[] arr) {   
      
     for(int i = 0; i < arr.length - 1; i++) //这个for循环是外循环,冒泡排序是比较两个相邻的元素,比较的次数是arr.length-1     {   
           for(int j = arr.length - 1; j > i; j--) //这个for循环就有很多表示方法了
           {   
              if(arr[j] < arr[j - 1])
              {   
                    
                   int tmp = arr[j];   
                    arr[j] = arr[j - 1];   
                    arr[j - 1] = tmp;   
                }   
           }   
        }   
    }   
}  
回复 使用道具 举报
楼上说的都对,但是想来楼主可能还没大搞懂冒泡是什么意思。
不知见过鱼吐泡泡没有,泡泡从下往上一点一点的飘到最上面。这算法是每次从最下面的记录开始,对每两个相邻的数据进行比较然后交换,进行下一次的排序。
for(int i = 0; i < arr.length; i++)
       for(int j = i; j < arr.length-1; j++)  
你的程序原先是这样,我直接用数组下标来表示 ,先是0和1,1和2,2和3,3和4.......一趟比较完后,数组元素变为3,2,5,6,9,10,11,12
第二趟,i值变为1,比较元素下标为1和2,2和3,3和4.......   这时你会发现,每个前边的元素都比后边要小,因为数组下标是从1开始的,所以不会发生替换,
第三趟,i值变为2,维持上述结果不变....直至循环结束.......
说到这里,不知楼主对于程序了解了不,冒泡的比较有点类似于找最值,每一次排序完成,要找到一个最大值或者最小值,放在数组的最前边,当然也可以是最后边,看你程序怎么写了,所以,内部循环j的值得从0开始

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
因为内循环的每一次比较都是从0角标开始的,每循环一次就会有一个最大的值跑到此次循环的最大角标位,所以j的初始值应该是0代表每一次从0开始,如果你j=i的话,当i=1时,内循环就是直接从角标为1的位置开始比较,就没有对0角标位上的值进行比较,还有因为每内循环一次就会有一个最大值在当次循环的最大角标上,下次还循环的时候就不用参与比较了,而且下面的if语句应该是
if(arr[j]>arr[j+1])
{
int temp=arr[j];
    arr[j]=arr[j+1];
    arr[j+1]=temp;
}
因为是arr[j]和arr[j+1]比较,所以应该是j<arr.length-x-1可以节省运算量

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报

  1. public class BubbleSort {

  2. public static void main(String[] args) {
  3. int[] arr = new int[]{5,3,2,6,12,10,9,11};
  4.                 bubbleSort(arr);
  5.                 for(int i =0; i < arr.length; i++)
  6.                 {
  7.                         System.out.print(arr[i]+" ");
  8.                 }
  9.         }
  10.         
  11.         public static void bubbleSort(int[] arr)
  12.         {
  13.                 for(int i = 0; i < arr.length; i++)
  14.                 {
  15.                         for(int j = i; j < arr.length-1; j++)  //这里如果j=i的话,那么外层循环i 的自增会影响到内层循环 J的值,从而是内层循环次数变少
  16.           {
  17.                                 if(arr[j] > arr[j+1])                /*例如,如果 i=arr.length-1时,那么j也就等于arr.length-1,那内层还怎么循环呢,所以楼主要仔细看看循环嵌套方面的知识点*/
  18.                                 {
  19.                                         int temp = arr[j];
  20.                                         arr[j] = arr[j+1];
  21.                                         arr[j+1] = temp;
  22.                                 }
  23.                         }
  24.                 }
  25.         }

  26. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
谢谢大家的解答,我已经找到问题了,当j的初始值如果为i,第一次循环结束之后,3就排在角标位0的位置了,当i自增为1的时候,角标为0的元素就没有参加比较,所以3就排在第一位了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马