js常用排序之冒泡排序、快速排序

本文对比了冒泡排序和快速排序两种算法。通过实验分析了这两种算法在处理长度为1000的数组时的性能表现,指出快速排序在效率上明显优于冒泡排序。

     一、冒泡排序

       原理:每一次比较数组中相邻的两个数据大小,如果前一个数据大于后一个数据,就交换这两个数据的位置。

        特点:简单易于理解,但比较次数多,效率差。 

var times = 0;  // 用于计算排序次数
var bubbleSort = function(arr) {
	var temp;
	for(var i = 0; i < arr.length - 1; i++){
		for(var j = i+1; j < arr.length; j++){
			if(arr[i] > arr[j]) {
				/* 如果前者大于后者,则先将前者存储于一个变量中,
				 * 然后将后者放置于前者的位置,再将变量中的数据
				 * 放于后者的位置,达到交换的目的
				*/
				temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
				times++;
			}
		}
	}
	return arr;
}
bubbleSort(arr);     // arr数组长度为1000
console.log(times);  // 250855 排序次数

        结果:长度为1000的数组,冒泡排序的次数为250855次

 

     二、快速排序

        原理:取一个数组的中部为基准点,将数组中每一个数据与基准点比较,比它小的放进左边的一个空数组,比它大的放进右边的一个空数组,然后对左右数组进行递归操作,直至数组长度 <=1。

        特点:效率好,常用,但递归一次就要另外声明两个数组,占用了内存。

var times = 0;  // 用于计算排序次数
var quickSort = function(arr) {
	// 如果递归数组至长度为1,就停止排序返回
	if(arr.length <= 1) {
		return arr;
	}
	// 取数组基准点
	var midIndex = Math.floor(arr.length/2);
	var midValue = arr.splice(midIndex,1);
	// 用左右两个空数组接收小于基准点的数据与大于基准点的数据
	var leftArr = [];
	var rightArr = [];
	for(var i=0; i < arr.length; i++){
		if(arr[i] < midValue) {
			leftArr.push(arr[i]);
		}else {
			rightArr.push(arr[i]);
		}
		times++;
	}
	// 递归操作
	return quickSort(leftArr).concat(midValue,quickSort(rightArr));
};

quickSort(arr);
console.log(times); // 10260 排序次数

        结果:长度1000的数组,快速排序次数为10260次。

 

      总结:同样为长度1000的数组,快速排序的性能比冒泡排序的性能高了二十多倍。但是随着数组长度的缩小,这个比例也会缩小,但就效率来说,快速排序始终是比冒泡排序快的。

转载于:https://my.oschina.net/huskydog/blog/859002

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值