三大经典排序算法

325 阅读2分钟
let ary = [12,8,24,16,1];

冒泡排序

冒泡排序的核心思想

让数组中的当前项和后一项进行比较,如果当前项比后一项大,则两项交换位置(让大的靠后)即可

动图演示

/*
* bubble:实现冒泡排序
* @params:
*	ary [ARRAY] 需要排序的数组
* @return
*	[ARRAY]排序后的数组
*/
function bubble(ary){
   let temp = null;
   //外层循环i控制比较的轮数
   for(let i=0; i<ary.length-1;i++){
      //控制每一轮比较的次数j
      for(let j=0;j<ary.length-1-i;j++){
        if(ary[j]>ary[j+1]){
          temp = ary[j];
          ary[j] = ary[j+1];
          ary[j+1] = temp;
        }
      }
    }
    return ary;
}

插入排序

动图演示

/*
* insert:实现插入排序
* @params:
*	ary [ARRAY] 需要排序的数组
* @return
*	[ARRAY]排序后的数组
*/
function insert(ary){
   // 1.准备一个新数组用来存储手里抓来的牌,开始先抓一张牌进来
   let handle = [];
   handle.push(ary[0]);
   
   //2.从第二项开始依次抓牌,一直到台面上的牌抓光
   for(let i = 1;i<ary.length;i++){
   	//A是新抓的牌
   	let A = ary[i];
        //和handle手里的牌依次比较,从后向前比
        for(let j=handle.length-1;j>=0;j--){
        //每一次要比较手里的牌
        let B = handle[j];
        //如果当前新牌A比要比较的B大了,把A放在B后面
        if(A>B){
           handle.splice(j+1,0,A);
           break;
        }
        //已经比较到第一项,我们把新牌放到手中最前面即可
        if(j===0){
           handle.unshift(A)
        }
    }
   }
   return handle;
}

快速排序

动图演示

/*
* quick:实现快速排序
* @params:
*	ary [ARRAY] 需要排序的数组
* @return
*	[ARRAY]排序后的数组
*/
function quick(ary){
	// 4.结束递归(当ARY中小于等于一项,则不用处理)
	if(ary.length<=1){
		return ary;
	}
	// 1.找到数组的中间项,在原有的数组中把它移除
	let middleIndex=Math.floor(ary.length/2);
	let middleValue=ary.splice(middleIndex,1)[0];
	// 2.准备左右两个数组,循环剩下数组中的每一项,比当前项小的放到左边数组中,反之放到右边数组中
	let aryLeft=[],
		aryRight=[];
	for(let i=0;i<ary.length;i++){
		let item=ary[i];
		item<middleValue?aryLeft.push(item):aryRight.push(item);
	}
	// 3.递归方式让左右两边的数组持续这样处理,一直到左右两边都排好序为止(最后让左边+中间+右边拼接成为最后的结果)
	return quick(aryLeft).concat(middleValue,quick(aryRight));  
}