插入排序
作者:互联网
插入排序思路
利用抓牌的思路去想
从后面插入方式
// 从后向前比较的情况
function insert(array) {
// 先准备一个空数组 拿牌
let handle = [];
// 先拿到第一张 这个是必须要有一张 需要下面循环的时候拿到一个进行比较
handle.push(array[0]);
// 对要进行排序的数组(要抓的牌)进行循环 要从1开始循环,因为第一项已经拿出来了
for (let i = 1; i < array.length; i++) {
// 抓到的牌/跟手里已有的牌进行比较 (从后向前比)
for (let j = handle.length - 1; j >= 0; j--) {
// 将抓到的牌进行比较
if (array[i] > handle[j]) {
// 抓到的牌 比手里的牌大 ,放到当前牌的后面 也就是handle[j]的后面
handle.splice(j + 1, 0, array[i])
break;
}
// 如果j=0时 说明已经到了最前面 只需要放到最前面即可
if (j === 0) {
handle.unshift(array[i])
}
}
}
return handle
}
let array = [12, 8, 24, 16, 1]
console.log(insert(array), '插入排序')
从前面插入方式
function insertiSort(arr) {
// 第一张牌是有序的直接放入数组
const result = [arr[0]];
const {
length
} = arr;
// 这层循环是模拟发除第一张牌以外剩下的牌
for (let i = 1; i < length; i++) {
const oldLen = result.length;
// 这层循环是将新发下来的牌与手里的每一张牌比较看看它比哪张大,比哪张小。
for (let j = 0; j < oldLen; j++) {
// 只要这张牌比与他比较的牌小
if (result[j] > arr[i]) {
// 就插入在这张牌之前
result.splice(j, 0, arr[i]);
// 插入之后结束本轮比较
break;
}
// 否则接着比较
}
// 比所有的都大说明没有插入手牌说明手里的牌没有增多
if (oldLen === result.length) {
result.push(arr[i]);
}
}
return result;
}
//测试一下
console.log(insertiSort([1, 3, 2, 6, 4, 5]));
whil方法
// 第三种方法
function insertionSort(arr) {
//外层循环:拿到标记的元素
for (let i = 0; i < arr.length; i++) {
let temp = arr[i];
//内层循环:从后往前比较元素的大小
let j = i;
while (arr[j - 1] > arr[j] && j > 0) {
arr[j] = arr[j - 1];
j--;
}
//最后便将其插入进去即可
arr[j] = temp;
}
return arr;
}
//测试一下
console.log(insertionSort([1, 3, 2, 6, 4, 5]));
效果展示
标签:arr,handle,插入排序,length,let,result,array 来源: https://www.cnblogs.com/loveliang/p/16388816.html