JavaScript实现经典排序算法之插入排序

作者:纸飞机时间:2026-10-21 19:10:23浏览:546

本文详细介绍JavaScript中插入排序算法的原理与实现。从基础的手牌类比入手,解析in-place排序机制及时间复杂度O(n)至O(n^2)。同时提供优化方案,利用二分查找定位插入点,提升性能,并附带完整可运行代码示例。

插入排序原理与过程

插入排序的代码实现虽然不如冒泡排序和选择排序那样直观粗暴,但其核心原理其实非常易于理解,就像任何人打过扑克牌都能立刻明白一样。想象你在整理一手扑克牌:开始时左手是空的,桌面上的牌面朝下放置。接着,你每次从桌面上拿起一张牌,并将其插入到左手中已排序好的正确位置。为了确定这张牌该放哪里,你需要从右向左,将它与左手中已有的每张牌进行比较。此时,左手中的牌始终保持有序状态,它们原本就是桌面上那堆牌的顶部部分。

1)算法原理

插入排序(Insertion-Sort)是一种简单且直观的排序方法。其核心思想是构建一个有序序列:对于尚未排序的数据,在已排序的序列中从后向前扫描,找到合适的位置并进行插入。在实现层面,插入排序通常采用原地排序(in-place)方式,即仅需O(1)的额外空间。因此,在从后向前扫描的过程中,需要将已排序的元素逐步向后移动,从而为当前待插入的新元素腾出空间。

2)算法描述和实现

通常情况下,插入排序直接在数组上进行原地操作。具体算法步骤如下:

<1> 从数组的第一个元素开始,该元素被视为已经排好序;

<2> 取出下一个未排序的元素,在已排序的元素序列中从后向前扫描;

<3> 如果已排序的元素大于新元素,则将该元素移动到下一个位置;

<4> 重复步骤3,直到找到已排序的元素小于或等于新元素的位置;

<5> 将新元素插入到该位置之后;

<6> 重复执行步骤2至5,直到所有元素处理完毕。

3)JavaScript代码实现


function insertSort(arr) { 
    for (var i = 1; i < arr.length; i++) { 
      var temp = arr[i]; 
      var j = i - 1; 
      while (j >= 0 && arr[j] > temp) { 
        arr[j + 1] = arr[j]; 
         j--; 
      } 
      arr[j + 1] = temp; 
    } 
    return arr; 
 } 
var arr = [1, 45, 37, 5, 48, 15, 37, 26, 29, 2, 46, 4, 17, 50, 52]; 
console.log(insertSort(arr)); 

改进插入排序:在查找插入位置时采用二分查找策略。具体步骤包括: <1> 从第一个元素开始,该元素被视为已经排好序; <2> 取出下一个元素,在已排序的元素序列中通过二分查找找到第一个比它大的数的位置; <3> 将新元素插入到该位置之后;

步骤: <1> 从第一个元素开始,该元素可以认为已经被排序; <2> 取出下一个元素,在已经排序的元素序列中二分查找到第一个比它大的数的位置; <3> 将新元素插入到该位置后;


function binaryInsertionSort(arr) { 
   for (var i = 1; i < arr.length; i++) { 
     var key = arr[i],left = 0,right = i - 1; 
     while (left <= right) { 
        var middle = parseInt((left + right) / 2); 
        if (key < arr[middle]) { 
          right = middle - 1; 
        } else { 
          left = middle + 1; 
        } 
     } 
     for (var j = i - 1; j >= left; j--) { 
        arr[j + 1] = arr[j]; 
     } 
     arr[left] = key; 
    } 
    return arr; 
} 
var arr = [1, 45, 37, 5, 48, 15, 37, 26, 29, 2, 46, 4, 17, 50, 52]; 
console.log(binaryInsertionSort(arr)); 

算法复杂度分析

4)算法分析

最佳情况:输入数组按升序排列。时间复杂度 T(n) = O(n) 最坏情况:输入数组按降序排列。时间复杂度 T(n) = O(n^2) 平均情况:时间复杂度 T(n) = O(n^2)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

作者最新文章