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));
}