当前位置: 代码迷 >> J2SE >> 为何选择排序要比较i,j,而冒泡排序要比较j,j+1
  详细解决方案

为何选择排序要比较i,j,而冒泡排序要比较j,j+1

热度:230   发布时间:2016-04-23 19:48:42.0
为啥选择排序要比较i,j,而冒泡排序要比较j,j+1?
本帖最后由 zhy934453950 于 2015-04-18 11:05:37 编辑
选择排序循环判断是这块:   看得懂,全能理解,先一层循环第0到4位,然后二层循环1到4位。这样i值就代表了被比较值,而j就代表了比较值。他俩做判断,如果有大小顺序不一致交换。
int[] arr= new [5];
for(int i=0;i<arr.length-1;i++)
{
    for(intj=i+1;j<arr.length;j++)
    {
        if(arr[i]<arr[j])
--------------------------------------------------------上面没问题,下面才有点看不懂----------------------------------------------

冒泡排序循环判断是这块:没有全看懂,不太理解,第一层循环好理解,同上,先一层循环第0到4位,问题是:    第二层循环,为啥只需要循环从1到总长度减外层次数的长度(我空间思维当时跟不上,不太理解)?还有我知道他是相邻两个值进行比较,可是为啥不是比较外循环i及内循环j呢?而是比较j,j+1不懂。
int[] arr= new [5];
for(int i=0;i<arr.length-1;i++) //这一行看得懂循环一遍变量
   {
       for(int j=0;j<arr.length-i-1;j++)   //这两行不理解
           {                                           
               if(arr[j]<arr[j+1])
如果绝对文字难表达清楚,能不能用“画图”简单画几笔示意下
------解决思路----------------------
你不要一看到i,j就先入为主认为它是脚标
arr.length-i-1,外循环的i是用来控制内循环的长度的(你可以认为是控制j能到达的最大脚标)
j和j+1就代表相邻元素了,遍历一遍就是所有相邻元素比较
比较完了此次的最值是不是到最上面了
所以每次比较完最上面的元素都应该被排除(即不再参与排序)
怎么排除,最大脚标不到那就OK了

真要和前面类比:
j 和 j+1 你可以看成是i,j,只是满足关系j= i+1而已
------解决思路----------------------
因为冒泡排序排了前n-1个之后,第n个不就已经是正确的位置了吗
------解决思路----------------------
引用:
那样为啥不,只一次for(int i=0;i<arr.length-1;i++) 让元素活动起来,然后直接i和i+1做对比不就好了?要个二层循环是不是有点多余?

冒泡排序,一次只能冒一个,内循环只是冒出那个泡(最值),也只能冒出一个
你一次比较没法把所有元素进行排序,只能选出最值
而外循环控制的是,把没冒的剩下的所有元素再排序(即控制内循环的上限,上限之外的都是冒出来排好序的)
双重循环是必须的
这样讲明白了么


------解决思路----------------------
选择排序就不说了。冒泡排序是每一轮相邻的两个数交换,把最大的数沉下去,一共n-1轮交换。
  相关解决方案