js常用排序算法冒泡-选择-插入-希尔

1冒泡排序:

没什么好说的,就是循环两次,两两比较,先找到一个最大或最小的值,再找剩余最大或最小的值,直到循环到最后;

先写几个公用方法:

/**
 * 数组初始化-随机数
 */
function fnGetRandomArr(arrLength){
	var randomArr=[];
	for(var i=0;i<arrLength;i++){
		randomArr[i]=Math.floor(Math.random()*(arrLength+1));
	}
	return randomArr;
}

/**
 * 打印结果
 * @param {Object} arr
 */
function toString(arr){
	var restr="";
	for(var i=0;i<arr.length;i++){
		restr+=arr[i]+' ';
		if(i>0&&i%10==0){
			restr+='\n';
		}
	}
	return restr;
}

/**
 * 数组位置数值交换
 * @param {Object} arr
 * @param {Object} index1
 * @param {Object} index2
 */
function swap(arr,index1,index2){
	var temp=arr[index1];
	arr[index1]=arr[index2];
	arr[index2]=temp;
}

冒泡排序:

var count=1;
/**
 * 冒泡排序
 * @param {Object} dataStore
 */
function fnBubbleSort(dataStore){
	var length=dataStore.length;
	for(var outer=0;outer<length-1;outer++){
		for(var inner=outer+1;inner<length;inner++){
			if(dataStore[outer]>dataStore[inner]){
				count++;//互换次数
				swap(dataStore,outer,inner);
			}
		}
	}
}

结果:

结论:性能很一般;

2 选择排序;

从冒泡排序的结果来看,在整个执行过程中,数组的值会出现大量的交换,而这是比较消耗性能的;选择排序与冒泡排序方法差不多,区别在于,选择排序是找的最小值或者最大值后,直接将这个值放到合适的位置上,中间不对数组进行“交换操作”;

/**
 * 选择排序
 * @param {Object} dataStore
 */
function fnSelectionSort(dataStore){
	var length=dataStore.length;
	var min=0;
	var temp=0;
	for(var outer=0;outer<length-1;outer++){
		temp=dataStore[outer];
		min=outer;
		for(var inner=outer+1;inner<length;inner++){
			if(temp>dataStore[inner]){
				temp=dataStore[inner];
				min=inner;
			}
		}
		if(outer!=min){
			count++;
			swap(dataStore,outer,min);
		}
		
	} 
}

执行结果:

结论:可以看到"count"值明显小了一些;

3 插入排序:

插入排序类似于打扑克时,放牌的动作。先抓了“方块8”,然后是“红桃4”,然后是“梅花7”,我们会整理成“红桃4”、“梅花7”、“方块8”类似这样;

/**
 * 插入排序
 * @param {Object} dataStore
 */
function fnInsertonSort(dataStore){
	var length=dataStore.length;
	var min=0;
	var temp=0;
	for(var outer=1;outer<length;outer++){
		temp=dataStore[outer];
		min=outer;
		while(min>0&&(dataStore[min-1]>=temp)){
			dataStore[min]=dataStore[min-1];
			min--;
		}
		dataStore[min]=temp;
	}
}

执行结果:

 

4 希尔排序-插入排序升级版:

希尔排序可以理解为插入排序的一个高级版本;区别在于它会先比较“较远”的元素,然后在比较“较近”的元素;这样就会尽快让比较远的元素回到合适的位置;而这样做为什么就会提高效率,不妨拿支笔画一画好好感受感受;而每次比较多远的值比较合适,

大佬Sedgewick给过一个公式:

var N=arr.length;
var h=1;
while(h<N/3){
    h=3*h+1;
}

//简化下来
h=(h-1)/3;
/**
 * 希尔排序
 */
function fnShellSort(dataStore){
	var N=dataStore.length;
	var h=1;
	while(h<N/3){
		h=3*h+1;
	}
	while(h>=1){
		for(var outer=0;outer<N;outer++){
			for(var inner=outer;inner>=h&&dataStore[inner]<dataStore[inner-h];inner-=h){
				count++;
				swap(dataStore,inner,inner-h);
			}
		}
		h=(h-1)/3
	}
	
}

结果:

 

5 性能比较:

5.1冒泡排序:长度为1w的随机数据耗时大概是300ms;超过10w比较吃力;

5.2选择排序:长度为1w的随机数据耗时大概是70ms;长度10w的数组大概在6.3秒;

5.3插入排序:长度为1w的随机数据耗时大概是30ms;长度10w的数组大概在3.3秒;

5.4希尔排序:长度为1w的随机数据耗时大概是6ms;长度10w的数组大概在30ms;;长度100w的数组大概在340ms;

js 数组 自身的排序

长度为1w的随机数据耗时大概是13ms;长度10w的数组大概在65ms;;长度100w的数组大概在700ms;

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值