黑马程序员技术交流社区

标题: 关于选择排序和冒泡排序代码里面的嵌套循环,搞不明白 [打印本页]

作者: 刘俊佳    时间: 2012-7-20 10:47
标题: 关于选择排序和冒泡排序代码里面的嵌套循环,搞不明白
本帖最后由 刘俊佳 于 2012-7-20 10:49 编辑

大家帮我详细解释下这两个嵌套循环,还有就是怎样利用这两个嵌套循环实现排序的,脑袋大了....


package array;
public class ArrayTest2 {
/**
  * 选择排序:内循环结束一次,最值出现头角标位置上。
  */
public static void main(String[] args)
{
  
            int[] arr={5,1,6,4,2,8,9};
            //在排序前
            printArray(arr);
            
            //selectSort(arr);
            bubbleSort(arr);
            //在排序后
            printArray(arr);
           
}
/*
          冒泡排序
    */

public static void bubbleSort(int[] arr)
{
  for(int x=0;x<arr.length-1; x++)
  {
   for(int y=0;y<arr.length-x-1;y++)//-x:让每次比较的元素减少。-1:避免角标越界。
   {
    if(arr[y]>arr[y+1]){
     int temp=arr[y];
     arr[y]=arr[y+1];
     arr[y+1]=temp;
     
    }
   }
  }
}



public static void printArray(int[] arr)
{
  System.out.print("[");
  for(int x=0;x<arr.length;x++)
  {
   if(x!=arr.length-1)
    System.out.print(arr[x]+",");
   else
    System.out.print(arr[x]+"]");
  }
}
public static void selectSort(int[] arr)
{
  for(int x=0; x<arr.length-1;x++)
  {
   for(int y=x+1;y<arr.length;y++)
   {
    //数据换位
    if(arr[x]>arr[y])
    {
     int temp=arr[x];
     arr[x]=arr[y];
     arr[y]=temp;
    }
   }
  }
}
}


作者: 杨洋    时间: 2012-7-20 11:41
直接选择排序是将指定排序位置与其他数组元素分别对比,如果满足条件就交换元素值。每一次从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好的数列最后,直到全部待排序的数据元素排完。
示意:数组【5 1 6 4 2 8 9】
第一次排序【5 1 6 4 2 8】9
第二次排序【5 1 6 4 2】8 9
第三次排序【5 1 2 4】6 8 9
第四次排序【4 1 2】5 6 8 9
第五次排序【2 1】4 5 6 8 9
第六次排序【1】2 4 5 6 8 9


冒泡排序(原来画图这么难,只能放这么大了)
    比较相邻的两个值,把较大值往后移动,相应小值往前移动(上升),直到排完














QQ截图20120720113543.png (67.23 KB, 下载次数: 388)

QQ截图20120720113543.png

作者: 焦晨光    时间: 2012-7-20 11:59
很简单 我给你说一下思想
选择排序
假设有5个数(a1 a2 a3 a4 a5) 循环全执行一次 a1与剩下的数挨个比较
有比a1大的数就将这个数下标跟a1互换,直到循环结束(a1存的是最大值)
然后下次循环从a2开始。。。。。重复上边的步骤。。。
很简单的思想
下面冒泡排序:
假设有5个数(a1 a2 a3 a4 a5)
循环全执行一次 a1与a2比较找出两个数之间大的值然后付给a2
然后a2和a3比较 找出大的数 付给a3.。。以此类推 到a5(存的是最大值)
然后下次循环按照上述方法 推到a4(存的是第二大值)
。。。。。。。
最后a1 存的是最小值
循环结束

很简单的思想


作者: 郑小杰    时间: 2012-7-20 12:19
视频里边,老毕讲的很详细啊,多看几遍头就不大了,呵呵
作者: rioy1    时间: 2012-7-20 12:38
分两步,先把当x=0时的情况想清楚了,脑袋就不大了。
第一次循环是从第一个开始每两个相邻的数字比较大小(x=0,y=0),把小的放在前面,排序结果为1542689,如果这里不理解,就把注释处的内循环看懂,看懂单循环后面的就不难了。
当x=1时(此时数字已经交换过一次) 再把154268交换成142568,依次类推。
  总之,先看懂里面的单循环!
作者: 黑马黄宏强    时间: 2012-7-20 12:58
老毕的视频里面说的很详细,建议你多看几次,弄明白每次外循环得出的是那个数值,内循环得出的结果又是那个值,什么时候可以arr.length-1 你就豁然开朗了
作者: 陈少文    时间: 2012-7-20 17:32
要理解选择排序,和冒泡排序

1.先理解for(){}

2.然后再理解
for()
{
        for()
        {
        }
}

打印个
        *****
        ****
        ***
        **
        *

        *
        **
        ***
        ****
        *****
        的图形


        public class Test
        {
          public static void main(String [] args)
         {        
                //外循环控制行数,内循环控制每一行的个数
                for(int a = 1;a<6;a++){
                        for(int b = a; b<6;b++){
                                System.out.print("*");
                        }
                System.out.println("");
                }
        //*********************************************************
                for(int a = 1;a<6;a++){
                        for(int b = 1;b <a;b++){
                                System.out.print("*");
                        }
                        System.out.println("*");
                }
          }
        }

3.然后理解换位





最后要理解选择排序,和冒泡排序就水到渠成了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2