免费做试用的网站商河县建设局网站
免费做试用的网站,商河县建设局网站,国家重点项目建设库网站,企业网站建设长沙主要说一下冒泡排序的一些关键地方的个人理解#xff0c;比如算法思想#xff0c;两个循环的作用意义#xff0c;中间循环变量范围的确定等。 原理#xff1a;比较两个相邻的元素#xff0c;将值大的元素交换至右端。思路#xff1a;依次比较相邻的两个数#xff0c;将小…主要说一下冒泡排序的一些关键地方的个人理解比如算法思想两个循环的作用意义中间循环变量范围的确定等。 原理比较两个相邻的元素将值大的元素交换至右端。思路依次比较相邻的两个数将小数放在前面大数放在后面。即在第一趟首先比较第1个和第2个数将小数放前大数放后。然后比较第2个数和第3个数将小数放前大数放后如此继续直至比较最后两个数将小数放前大数放后。重复第一趟步骤直至全部排序完成。
第一趟比较完成后最后一个数一定是数组中最大的一个数所以第二趟比较的时候最后一个数不参与比较第二趟比较完成后倒数第二个数也一定是数组中第二大的数所以第三趟比较的时候最后两个数不参与比较依次类推每一趟比较次数-1
……举例说明要排序数组int[] arr{6,3,8,2,9,1};
第一趟排序
第一次排序6和3比较6大于3交换位置 3 6 8 2 9 1
第二次排序6和8比较6小于8不交换位置3 6 8 2 9 1
第三次排序8和2比较8大于2交换位置 3 6 2 8 9 1
第四次排序8和9比较8小于9不交换位置3 6 2 8 9 1
第五次排序9和1比较9大于1交换位置 3 6 2 8 1 9
总共进行了5次比较 排序结果 3 6 2 8 1 9 第二趟排序
第一次排序3和6比较3小于6不交换位置3 6 2 8 1 9
第二次排序6和2比较6大于2交换位置 3 2 6 8 1 9
第三次排序6和8比较6大于8不交换位置3 2 6 8 1 9
第四次排序8和1比较8大于1交换位置 3 2 6 1 8 9
总共进行了4次比较 排序结果 3 2 6 1 8 9 第三趟排序
第一次排序3和2比较3大于2交换位置 2 3 6 1 8 9
第二次排序3和6比较3小于6不交换位置2 3 6 1 8 9
第三次排序6和1比较6大于1交换位置 2 3 1 6 8 9
总共进行了3次比较 排序结果 2 3 1 6 8 9 第四趟排序
第一次排序2和3比较2小于3不交换位置2 3 1 6 8 9
第二次排序3和1比较3大于1交换位置 2 1 3 6 8 9
总共进行了2次比较 排序结果 2 1 3 6 8 9 第五趟排序
第一次排序2和1比较2大于1交换位置 1 2 3 6 8 9
总共进行了1次比较 排序结果 1 2 3 6 8 9 最终结果1 2 3 6 8 9 6 个数。比了5趟。第一趟比了5次第二趟比了4次第三趟比了3次第四趟比了2次第五趟比了1次。 6 第 i 趟 -------------- 比 i 次 ----------------- i从0开始规律 1 ------------------------5 -------------------------- n-i-1 2 ----------------------- 4 ---------------- 3 ------------------------3 --------------- 4 ------------------------2 -------------- 5 ------------------------1 -------------- 由此可见N个数字要排序完成总共进行N-1趟排序每i趟的排序次数为(N-i)次所以可以用双重循环语句外层控制循环多少趟内层控制每一趟的循环次数即 for(i 0; i n-1; i) //n是数组长度即元素个数 for(j 0; j n-i-1; j)
外层循环的作用是 提取出目前未排序数组中最大的数放置于已排数据的左边。也就是说我们第一次外层循环是把最大数的位置交换到数组的最右边第二次外层循环是把次大数交换到数组的次右边依次类推。 内层循环的作用是 实现我们想要的大数下沉的过程。每次比较的是相邻两个数据所以数组的长度n我们只需要做 n-1 次的比较就可以实现大数下沉而 之前循环已经沉淀的大数并不需要再进行 排序了。 很清楚的看到N个数字要排序完成总共进行N-1趟排序
为什么外层循环判断条件是in-1呢
n 个数字总共需要 n-1 趟排序i n-1外层循环变量 i 从 0 到 n-1 前一位 正好是 n-1 次。
为什么内层循环判断条件是j n-i-1呢
这要从冒泡排序原理说起冒泡排序每循环排序一次,就把最大的一个数排在了最右边默认升序排每一次排序都是在上一次排序的基础上再排序比如第2次排序之后i已经成2了第三次排序是要在第二次的基础上在进行排序而第二次排序后就已经把两个最大的数已经放到最后了所以第三次排序就不需要在去比他俩就得把这个“2“减掉只需要循环n-i次此时的i是2为什么-i之后还要-1呢 这是因为在内层循环的判断中是把当前值和后面一个值做比较的。如果不减1则当循环到最后一个值的时候再取下一个值就取不到就需要额外的操作或者抛出数组下标越界的异常。
其实内层的 jn-i-1 这个范围的确定 让人纠结它主要有两种理解方式
1 就是标准解释 上述的防止数组下标越界比如n[] {5, 22, 7, 42, 23}个数n5i现为2n-i3i为2即进行第3趟两个数已经确定好只需要比较前三个数了而这只需要比较2次即n-i(为2)-12。如果不减一这里就是n-i(为2) 3比三次这显然是错的。就是正常是
if n(0)n(1)
if n(1)(2) 这是正确的不正确时5-23 j从0到3 得比3次
if n(0)n(1)
if n(1)(2)
if n(2)(3) 这就比错了 这都把 确定好的倒数第二大的数再给比较这就是错了。就成乐下表越界了。2 每趟的比较中都是n-1次每趟中都是比总共这次要比的数的个数减一次再加上要把i这已经确定的数的个数减去即就是 j-i-1。实际上这也是n-in把来的i减去剩下的待排序的数共有多少个他们的个数再减去一就是他们这些剩下的数需要比较的次数了这个跟网上说的数组是从下标0开始没啥关系下标从0或1开始影响的是内层循环的比较是0就直接引用是1就得n[i-1]。至于说的这个从0开始的说法则它根本上也是想说防止下标越界。
3 第 i 趟的比较比 n-i 次。正常来说 i 是要从1 开始的但是i时间给定了从0开始所以每趟比较次数开始从i为0开始所以每回把一减掉。意思 n-i-1 随着i开始的起步从1往0退一个所以n-i-1 中的 -1 也就是随着往前退一个。
至于算法优化什么的暂时不考虑这里只简单说明了算法中几个关键的点。 个人学习感悟如有错误还请指正。
附一些讲冒泡比较好的说的文章 https://blog.csdn.net/kelinfeng16/article/details/84034386 https://www.cnblogs.com/shen-hua/p/5422676.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/89708.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!