JavaScript中冒泡排序

在我大学的时候,就已经接触到过很多的排序方式,只是那时候听得还很懵懂,大概知道这么个东西,也对冒泡排序有点印象,但真要我写,我是写不出来的。最近,在回顾js基础的时候,又接触到了冒泡排序。于是,就把冒泡排序又仔细的研究了一遍,以下是我个人的理解。

在讲冒泡排序之前,首先要知道的就是冒泡排序的原理。

说的简单点,冒泡排序就是数组每中两个相邻的数字进行比较,如果后面的数字比前面的数字小,那么就让这两个数字交换位置,比如:

arr=[5,3];

数组中有两个数值,前面的数比后面的数大,就让他们两个交换位置,数组就变成了

arr=[3,5];

这是最简单版本的,那么三个数字的时候呢,

arr=[5,3,1];

这时候就让第一个数字5跟第二个数字3比较,53大,所以53调换位置,数组就变成了

arr=[3,5,1];

这时候再让第二个数字5跟第三个数字1比较,5比较大,所以51调换位置,数组就变成了

arr=[3,1,5];

这样,一轮循环就就行完了,此时,最大的数已经被排序到了最后,很明显,数组还没有排序完成,所以就要进行第二轮循环

再让第一个数字3跟第二个数字1进行比较,3比较大,所以31调换位置,数组就变成了

arr=[1,3,5];

这个时候,重点就到了,要不要再把第二个数字跟最后一个数字进行比较,这里我说最后一个数字而不是第三个数字,就是因为在第一次排序的时候,已经排序出了最大的那个数字,并且放在了最后,所以就不用在拿倒数第二个数字跟最后一个数字比较了。

所以,继续给数组增加内容,变成一个含有n个值得数组,

让第一个数字跟第二个数字进行比较,如果第一个数字比第二个大,就让两个数字交换位置,然后再让第二个数字跟第三个数字进行比较,如果第二个数字比第三个数字小,那就不做任何改变,继续让第三个数字跟第四个数字比较,一直到第n-1个数字,此时,第n-1个数肯定是之前数字中最大的,再拿n-1n比较,如果n-1大于n,那么n-1就跟n交换位置,如果n-1小于n,那么这两个数的位置不变,此时,n就是 数组中最大的那个数,并且放在了数组的最后面。第一轮循环结束。

然后进入第二轮循环,重复第一轮的过程,直到n-2这个数,同上,n-2肯定是之前数字中最大的。拿n-2n-1比较,如果n-2大于n-1,那么n-2就跟n-1交换位置,否则的话n-1n-2的位置不变,此时n-1就是数组中第二大的数,并且放在数组的倒数第二个位置,第二轮循环结束。

重复这样的循环,直到排到第一个数跟第二个数为止,这样,整个数组就肯定是从小到大的排列了。不过,这样子的排序并不是一定要排到第一个数字跟第二个数字为止,因为,有可能排完中间某两个数之后,数组就已经是按照从小到大的排列了。比如:

原来的数组是这样的

arr=[1,2,4,5,3];

在经过第一轮冒泡排序之后,数组就变成了

arr=[1,2,4,3,5];

然后数组进入第二轮冒泡排序,数组就变成了

arr=[1,2,3,4,5];

很明显,数组已经排序完成了,此时,但是按照之前说的,数组还会继续排序。这样,会很消耗系统的资源,所以我们要设置一个标志,来控制循环的结束。如果一轮循环中,没有任何两个数字交换位置,就意味着数组已经排序完成了,就没有必要再进行之后的排序了。这样,我们就可以减少排序的次数,加快排序的时间,减少系统资源的消耗。

其实,冒泡排序在写的时候并没有那么难,主要就是三点。首先,就是要用一层循环来控制循环的次数,其次,再用一层循环来给相邻两个数字做比较,最后,要设置一个标志,来控制循环的时间复杂度,从而减少没必要的循环。

下图是一个用函数封装的关于冒泡排序的代码。

 

就这样,冒泡排序就完了,只要了解冒泡排序的原理,然后再按着思路自己写写看,冒泡排序其实也不是那么难。

转载于:https://www.cnblogs.com/wqc5730/p/5712804.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值