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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 刘俊佳 于 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;
    }
   }
  }
}
}

6 个回复

倒序浏览
直接选择排序是将指定排序位置与其他数组元素分别对比,如果满足条件就交换元素值。每一次从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好的数列最后,直到全部待排序的数据元素排完。
示意:数组【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

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
很简单 我给你说一下思想
选择排序
假设有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 存的是最小值
循环结束

很简单的思想

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

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.然后理解换位





最后要理解选择排序,和冒泡排序就水到渠成了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马