javaScript中常见的五种排序(冒泡、快速、插入、选择、sort)详解

1、冒泡排序
实现思路:相邻两个数进行比较,大数下沉,小数向上浮。如果前一个数比后一个数大就交换

function fnSort( arr ){
	var temp = null;
	for ( var i = 0 ; i < arr.length - 1 ; i++){
		for( var j = 0 ; j < arr.length - i -1 ; j++){//i每循环一次,j就少遍历一层
			if( arr[j] > arr[j+1] ){//相邻数进行比较
				//运用第三个变量,实现两个变量之间值的交换
				temp = arr[ j ];
				arr[ j ] = arr[ j +1 ];
				arr[ j + 1 ] = temp;
			}
		}
	}
	return arr ;
}

2、选择排序
实现思路:每一趟比较时,依次取出数组中的某个值和后面的数进行比较,如果该数大于后面的数就交换

function fnSort( arr ){
	//定义一个空变量,作为后面两个数交换的中间量
	var temp = null ; 
	for ( var i = 0 ; i < arr.length - 1 ; i++){
		for ( var j = i+1 ; j < arr.length ; j++){//取出arr[i],并与第i个元素后面所有的元素进行比较
			if( arr[i] > arr[j] ){
				temp = arr[ i ];
				arr[ i ] = arr[ j ];
				arr[ j ] = temp;
			}
		}
	}
	return arr;
}

3、sort排序
//sort 按照数值排序

var arr = [10,12,9,23,89];
	arr.sort( function( a,b ){
		return b-a; // a-b 升序   b-a降序        a-b>0  a>b
	} )
	alert( arr );

4、快速排序
实现思路:快速排序(quickSort)是基于冒泡排序的一种改进,该排序算法采用了分治的思想,将待排序数组逐步划分两个部分,其中左半部分都要小于右半部分,再将左右部分分别进行快速排序,整个过程可采用递归进行,直到排成一个有序数列。

function fnSort(arr){
	if( arr.length <=1 ) return arr;
	var midIndex = parseInt( arr.length / 2);记录中间值下标
	var midVal = arr[ midIndex ]; //取出中间值
	var left = []  //左半部分数组
	var right = [ ] //有半部分数组
	for( var i = 0 ; i < arr.length ; i++){
		if( i == midIndex){//如果是中间值本身,直接跳过
			continue;
		}
		if( arr[ i ] > midVal){//当该元素大于中间值时放到右侧
			right.push( arr[i])
		}else{//当该元素小于中间值时放到左侧
			left.push( arr[i] )
		}
	}
	//使用递归的思想,重复上述方法
	return fnSort(left).concat(midVal).concat(fnSort(right));
}

5、插入排序
实现思路:1从第一个元素开始,该元素可以认为已经被排序2取出下一个元素,在已经排序的元素序列中从后向前扫描3如果该元素(已排序)小于新元素,将新元素插入该元素下一位置4 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置,将新元素插入到该位置后5若无,则将新元素插入最左侧6 重复步骤2~5

function fnSort(arr){
	for ( var i = 0 ; i < arr.length ; i++){
		//针对每一项都试图将它插入到前面有序的数组当中
		var m = i ;
		//前提: 1前面必须有内容
		//前提: 2 当前这个元素,比左边小,交换一次
		while( m - 1 >= 0 && arr[m] < arr[ m - 1] ){
			var temp = arr[m];
			arr[m] = arr[m-1];
			arr[m-1] = temp;
			m--;
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值