排序算法:Javascript实现冒泡排序


一、算法原理

按从小到大排列顺序的实现来举例,冒泡的过程是指:

从第一个数开始,相邻两个数之间比较,将较大的数记为a;若a处于后者则顺序不变动,不是处于后者则将其与对比的较小的数调换(如同“往上”冒一个泡);然后重新比较a的值和其后面一位数的大小,将较大的数重新设为a,再次使a“冒泡”;反复往后比较并“冒泡”,直到a到达数列底部(“水面”);

以上为一次冒泡过程,得到了一个最大值,然后继续开始第二次冒泡过程,这时只需要在排除最后一个数(已排序成功的最大值)的子数列中进行冒泡,同理将第一个数冒泡至该子数列底部。

......

重复上述冒泡循环,直到倒数第二个数冒泡完成(倒数第二个数排序完成,则剩下的最后一个数顺序也就确定了),假设数列一共有n个数,则需要进行n-1次循环的冒泡过程

每次冒泡过程的具体逻辑都是一致的,也是一个循环,即随着当前(子)数列索引j(假设从0开始)的递增,循环判断相邻的两项大小(进行冒泡),直到当前索引j等于当前(子)数列个数减1(注意“当前”的冒泡数列的长度是递减的)。

二、算法实现

根据以上逻辑,我们可以写出以下的代码实现(i值循环递减的写法):

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

function bubbleSort(arr){
	var len = arr.length;
	
	for(var i=len-1; i>0;i--){

		for(var j=0;j<i;j++){
		    // 由小到大用 >, 由大到小就是 < 
			if(arr[j] > arr[j+1]){
				var tmp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = tmp;
			}

		}
	}

}

bubbleSort(arr);    // [0, 1, 2, 3, 5, 5, 7, 8, 9]
复制代码

还有另外一种写法,也放出来供对比一下(i值循环递增的写法):

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

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

		for(var j=0;j<len-1-i;j++){
		    // 由小到大用 >, 由大到小就是 < 
			if(arr[j] > arr[j+1]){
				var tmp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = tmp;
			}

		}
	}

}

bubbleSort(arr);    // [0, 1, 2, 3, 5, 5, 7, 8, 9]
复制代码

两种方式都可以,看各人喜好吧 :p

三、算法复杂度

冒泡排序的最坏情况时间复杂度为O(n^2),最好情况时间复杂度为O(n),平均时间复杂度为O(n^2);其空间复杂度为O(1)

冒泡算法是一种简单的排序算法,缺点也很明显,就是消耗的时间比较多。

之后会总结另外一种排序算法——快速排序,它是在冒泡排序的启发下进行的改良,也是很常用的排序算法。

转载于:https://juejin.im/post/5ca8224751882576316f3fcc

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值