冒泡排序(保姆级教学)

首先,让我们来看这张图片可能大家伙看完后有一部分小伙伴就懵了。

 这是啥啊???

我知道你很急但你先别急,且听我娓娓道来ヾ(o◕∀◕)ノヾ

让我们从下到上来看这张图,目光锁定在始初这一列上。这一列的意思就是:目前我这里有一组数据(1,5,2,8,6,4,3,9,7)我们把这些数放在一起(一个集合里面)就叫做数组。那目前这个数组里面的数据是没有大小顺序的,我们要想把这组数据变得有序,那就得依靠大小比较了。

首先我们拿出一个开头的数字“1”,把“1”与跟他相邻的“5”作比较。得出“1”比“5”小,那我们就把“1”与“5”交换位置;当“1”换了位置后,再将“1”与它相邻的“2”做比较,如果“1”比“2”小,那我们就把“1”与“2”交换位置;当“1”换了位置后,再将“1”与它相邻的“8”做比较,如果“1”比“8”小,那我们就把“1”与“8”交换位置..........以此类推。“1”将会被换到这个数组的最后面。(通过计数君的发现居然让“1”与其他的数进行了8次比较

那现在数组的开头也就变成了以“5”开头“1”结尾(5,2,8,6,4,3,9,7,1)。接下来就该上演帽子戏法了!!!

 将数组开头的“5”与“2”进行比较,居然发现“5”比“2”大 Σ(⊙▽⊙"a(总不能把大的数换到前面去吧) 这样我们该怎么换位呢?我的建议是:直接放弃“5”,用第二个数“2”与“8”进行比较(既然“5”动不了,那就只能动“2”了)那这样就好啦,经过与后面数字一系列的比较“2”来到了“1”的屁股后面。这时“2”可以不与“1”进行比较,因为它们已经比较过一次了。(这次通过计数君的发现这一轮一共比较了7次)

聪明的你是否已经发现我们将所有的数字按大小顺序排列好一共经过了八轮变化 ,第一次变化我们进行了八次比较 ,第二次变化我们进行了七次比较 ........以此类推。我们就发现了一个惊人的秘密:冒泡排序比较的轮数是数组长度减1,每轮比较的对数等于数组的长度减当前的轮数

下面直接上代码

var arr = [1, 5, 2, 8, 6, 4, 3, 9, 7];                //定义一个名为arr的数组
for(var i = 0; i < arr.length - 1; i++){              //控制需要比较的轮数
       for(var j = 0; j < arr.length - 1 - i; j++) {      //控制每轮需要参与比较的元素
           if (arr[j] > arr[j + 1]) {                 //比较相邻的两个元素
               var temp  = arr[j];        //将第一个元素赋值给一个空元素(此时第一个元素就为空)
               arr[j] = arr[j + 1];       //将第二个元素赋给第一个元素(此时第二个元素就为空)
               arr[j + 1] = temp;         //将temp元素(也就是装着第一个元素)赋给第二个元素
           }
       }
   }
console.log(arr);    //输出结果为:1, 2, 3, 4, 5, 6, 7, 8, 9

 

 什么???你居然还是看不懂?那就为你解释一下吧:

var arr = [1, 5, 2, 8, 6, 4, 3, 9, 7]; 

这段代码表示我们创建了一个名叫arr的数组,但里面的元素都是乱序的

 for(var i = 0; i < arr.length - 1; i++) {

         //代码体

         //代码体

                } 

这个for循环是控制比较的轮数,由上文的结论我们可以得知:比较的轮数是数组长度减1,所以我们设置for循环的次数为数组长度(length)然后减1,(这里的i分别可以为0, 1, 2,3, 4, 5, 6, 7    一共八次)

for(var j = 0; j < arr.length -1 - i ; j++) {

         //代码体

         //代码体

}

这个被嵌套在上一个for循环中的循环是用来控制参与比较的对数。var j = 0 表示从第一个数开始,由上文可知每轮比较的对数等于数组的长度减当前的轮数 ,所以第一轮比较的对数应为 arr.length - 1,第二轮比较的对数应该为 arr.length - 2,.........以此类推,最后为arr.length - 8。但但但问题来了我们进行第一次循环的时候 i  = 0 ;那就意味着第一轮就变为了 arr.length - 0 。所以为了让它变回正常的 arr.length - 1 我们就要在最后面多减去一个1。最后整理可得 j < arr.length - 1 - i(arr.length 表示名叫arr这个数组的长度,有几个数length就为几)

if (arr[j] > arr[j + 1]) {                 
               var temp  = arr[j];       
               arr[j] = arr[j + 1];    
               arr[j + 1] = temp;      
           } 

最后这段写在两层for循环中的if语句总体的意思就是在比较两个数的大小并把它们交换位置。如果你看懂上面的代码,那首先你得明白一个例子:当你有一瓶玻璃瓶装的豆奶跟一瓶易拉罐装的可乐,你觉得用易拉罐喝可乐不爽!!!你想用玻璃瓶喝可乐怎么办???首先我们是不是要找一个空杯子,把可乐倒入空杯子再把豆奶倒入易拉罐里最后把可乐倒入玻璃瓶中。这样我们就完成了互换,此时玻璃瓶里装是可乐,易拉罐里装的是豆奶。这题也是同样的意思:用if语句进行比较如果arr[j]>arr[j+1]那么我们就要新建一个变量var temp(空杯子) = arr[j](用来放第一个数arr[j]),再将arr[j + 1]赋值给arr[j](这时arr[j]里面就变为了arr[j + 1]的值)最后将temp的值(也就是最开始arr[j]的值)赋给arr[j + 1]这样就完成了这两个值位置的互换。if比较的原理就是让数组里面的数第1个位置里面的数与第2个位置里面的数比,第2个位置里面的数与第3个位置里面的数比,第3个位置里面数与第4个位置比.......以此类推。如果遇到了两个位置,比如第1个位置的数比第2个位置的数大就交换两个数的位置,再让第2个位置的数与第3个位置的数比,如果第2个位置的数大则第2个位置的数与第3个位置交换数据...........以此类推,如果第1个位置的数比第2个位置的数小则进行下一次比较但比较的方式不会变:接着就变为了第2个位置里面的数与第3个位置里面的数相比.......以此类推最后较大的数会被排在后面,较小的数就在前面。

敲了好久终于敲完了,看都看到这里了能不能留下一个免费的赞呢?n(*≧▽≦*)n 

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值