开发者社区> 问答> 正文

冒泡排序法没看懂

public static void arrMPpaixuMin(int[] arr) { for(int i=0;i

展开
收起
知与谁同 2018-07-18 19:49:08 1673 0
4 条回答
写回答
取消 提交回答
  • 第一次内层循环:for(int j=0;j<arr.length-i-1;j++) //这两行不理解
    此时i=0,循环完内层,内层循环时如果满足这个条件:if(arr[j]<arr[j+1]) //这两行不理解
    ps:注意看,这个条件是比较数组第一个数和第二个数大小,相信你懂,但是里面都是 j j +1,(不是i+1),看清楚这个,不然容易把外层循环的i和j和数组给联系起来,那就不是简单冒泡排序了 - -
    当j<arr.length-i-1(j<arr.length-0-1),也就是 j 满足循环一轮完成后,数组中就有一个最小数被冒泡到数组最后面了(一定要记住一轮只冒泡了一个数)
    然后外层循环:for(int i=0;i<arr.length-1;i++) //这一行看得懂循环一遍变量
    ---------------------------------
    双层循环,本人浅显的认为,外层循环一次,里面就要循环很多次,直到里面的循环满足条件,再到外层循环进行一次循环,再到里面循环很多次。。。。盗梦空间一样
    --------------------------------
    就是冒泡多少次,假如有2个数,就要来1轮,有3个数,就要来2轮,来n个数,就要来n-1轮
    为什么要来n-1轮冒泡呢。因为前面说了一轮只冒泡一个数,本来理论上要冒泡n轮才得到最终结果,但是当排除了n-1个最大嫌疑犯(嫌疑犯- -),是不是只有一个是真相了呢。也就是冒泡了n-1个数以后,最后一个数不用冒泡都能知道他是不是最大或最小呢,划重点:冒泡是为了排序啊,排序之后肯定是有最大值和最小值,所以最后一个数肯定是最大值或最小值。
    2019-07-17 22:50:06
    赞同 展开评论 打赏
  • 写几个无序的数字,按照程序一步一步来,你就知道了,而且印象深刻,绝对忘不了。。。
    2019-07-17 22:50:06
    赞同 展开评论 打赏
  • 社区管理员
    那个大小比较是说,如果前一个数比后一个小,则交换位置;

    假设有n个数(n就是上边程序中的arr.length)
    第一次冒泡排序(这时候i=0),最大的数就排在了最后。
    所以第二次(这时候i=1)排序的时候就从第一个开始比较到倒数第二个就可以了,
    这样,第三次排序只需比较到倒数第三个
    第i次比较,只需要比较到(n-i)个,也就是下标为(n-i-1)的数
    2019-07-17 22:50:06
    赞同 展开评论 打赏
  • TA有点害羞,没有介绍自己...
    我给你说一下冒泡的原理吧:
    冒泡冒泡,顾名思义,就是往上走的意思。
    冒泡排序是要依靠两层循环,外层控制次数,内层逐个比较。
    第一次外层循环将最大(最小)的值放到最上面(数组最后面);
    第二次外层循环把第二大(小)的值放到从上往下第2个位置:(数组最后一个)
    那么,每一次外层循环,内层的循环只需要循环从1到总长度减外层次数的长度,这就是:
    for(int j=0;j<arr.length-i-1;j++) 这一行的意义;

    然后实现把最大(最小)的值放到最后面的方法是挨着的两个数依次做判断。这就是:
    if(arr[j]<arr[j+1]) 这一行的意义;如果当前值比后面的一个值小,则两个值交换位置。

    你的这个排序是要把最小的放到最后面,也就是从大到小的排序。
    我估计你对边界:j<arr.length-i-1;会不解,为什么-i之后还要-1呢。
    这是因为在下面的判断里面你是把当前值和后面一个值做比较的。如果不减1,则当循环到最后一个值的时候,再取下一个值就取不到,就需要额外的操作,或者抛出数组下标越界的异常。
    2019-07-17 22:50:06
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
面试常考算法 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载