一、算法描述
将未排序的元素与已排序的元素从后往前依次对比,后者小于前者,则已排序元素依次往后挪一位,直到后者刚刚小于前者,将后者插入此时的位置
二、算法实现
- 默认第一个元素已排序,剩下未排序的元素依次和已排序的最后一位元素依次往前进行对比
- 如果未排序的元素比已排序的最后一位元素小,则已排序的元素依次往后挪一位空间
- 找到不满足条件的索引,在此索引插入对比的未排序元素,继续重复<1> <2>步骤
三、代码实现
function insertSort(arr = []){
if(arr.length === 0){
return arr;
}
for(let i = 1; i < arr.length; i++){
for(let j = i - 1; j>=0; j--){
if(arr[j]>arr[j+1]){
[arr[j+1],arr[j]] = [arr[j],arr[j+1]]
}
}
}
return arr
}
利用二分法,将排好的元素利用二分法查找,减少对比的次数
function insertSort(arr = []){
if(arr.length === 0){
return arr;
}
for(let i = 1; i < arr.length; i++){
let left = 0;
let right = i - 1;
while(left<=right){
let middle = Math.floor((left+right)/2)
if(arr[middle]>arr[i]){
right = middle - 1;
}else{
left = middle + 1
}
}
for(let j = i - 1; j>=left; j--){
if(arr[j]>arr[j+1]){
[arr[j+1],arr[j]] = [arr[j],arr[j+1]]
}
}
}
return arr
}
四、图示