插入排序

说明

每次都将当前元素插入到左侧已经排序的数组中,使得插入之后左侧数组依然有序。当数组[3,4,1]排序时,先将[3]归为已排序的数组,[4,1]为未排序数组,遍历未排序数组,先取4和3比较,正序排序就不变,反序就交换两个值。…遍历完成,已排序数组越来越大,未排序数组越来越少。直到排序完成。

时间复杂度

插入排序的时间复杂度取决于数组的初始顺序,如果数组已经部分有序了,那么逆序较少,需要的交换次数也就较少,时间复杂度较低。

示例

function insertion(nums: number[]) {
    let len = nums.length;
    for (let i = 1; i < len; i++) {
        for (let j = i; j > 0; j--) {
            //  交换两个值 判断条件 正序反序 
            if (nums[j] < nums[j - 1]) {
                swapInsertion(nums, j, j - 1);
            }
        }
    }
    return nums;
}




/**
 * 交换数组中两个值
 * @param {number[]} nums -js中数组是引用类型
 * @param {number} i
 * @param {number} min
 */
function swapInsertion(nums: number[], i: number, min: number) {
    var swapValue = nums[i];
    nums[i] = nums[min];
    nums[min] = swapValue;
}


const insertionNumbers = [3, 4, 1];
console.log(insertion(insertionNumbers));

排序示例

步骤 已排序 未排序 总数组
1 [3] [4,1] [3,4,1]
2 [3,4] [1] [3,4,1]
3 [1,3,4] [] [1,3,4]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章