插入排序
【类似摸牌排序】
let handle = [];
handle[0] = ary[0]; // 开始随便拿一张牌
for (let i = 1; i < ary.length; i++) {//从第二张开始循环摸牌
const A = ary[i];
for (let j = handle.length; j >= 0; j--) {
// 将摸到的牌和手里的牌循环对比
const B = handle[j];
if (A > B) {// 如果摸到的牌大于循环到的当前的牌就放到这个牌的前面
handle.splice(j + 1, 0, A);
break;
}
if (j === 0) {
// 如果已经比较到手上的最后一张牌还是没有比较完成
// ,就放到最前面
handle.unshift(A);
}
}
}
return handle;
}
var ary = [21,11,23,26,3,20,16];
var ary = sortInsertAry(ary);
console.log(ary);// [3, 11, 16, 20,21, 23, 26]
冒泡排序
第二个循环-i的原因是:
每一轮晚后,最大的永远被专递到后面了,所以下一次就不需要比较已经排好的了,
var ary = [2, 1, 2, 7, 1, 3];
function sortAry(ary) {
for (let i = 0; i < ary.length - 1; i++) {
for (let j = 0; j < ary.length - 1 - i; j++) {
if (ary[j] > ary[j + 1]) {
[ary[j + 1], ary[j]] = [ary[j], ary[j + 1]];
}
}
}
return ary;
}
var ary = sortAry(ary);
console.log(ary);//【 1,1,2,2,3,7】
快速排序
function sortQuikAry(ary) {
if (ary.length <= 1) {// 最后只有一个元素的时候组件返回当前数组即可
return ary;
}
// 拿到中间元素下标
const centerIndex = Math.floor(ary.length / 2);
// 拿到中间元素,并在原数组中删除该元素
const centerValue = ary.splice(centerIndex, 1)[0];
let leftAry = []; // 小于中间元素的数组集合
let rightAry = [];// 大于中间数组的数组集合
for (let i = 0; i < ary.length; i++) {
const item = ary[i];
if (item > centerValue) {
rightAry.push(item);// 加入大于中间元素的数组
} else {
leftAry.push(item);// 加入小于中间元素的数组
}
}
// 递归
return [...sortQuikAry(leftAry), centerValue, ...sortQuikAry(rightAry)];
// return sortQuikAry(leftAry).concat(centerValue, sortQuikAry(rightAry));
}
var ary = [21, 11, 23, 26, 3, 20, 16];
var ary = sortQuikAry(ary);
console.log(ary);