es6 插入排序

120 阅读1分钟

一、算法描述

将未排序的元素与已排序的元素从后往前依次对比,后者小于前者,则已排序元素依次往后挪一位,直到后者刚刚小于前者,将后者插入此时的位置

二、算法实现

  1. 默认第一个元素已排序,剩下未排序的元素依次和已排序的最后一位元素依次往前进行对比
  2. 如果未排序的元素比已排序的最后一位元素小,则已排序的元素依次往后挪一位空间
  3. 找到不满足条件的索引,在此索引插入对比的未排序元素,继续重复<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
}

四、图示

19126126-d958eea5d17e071c.gif