直接插入排序详解

226 阅读2分钟

「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战

介绍

插入排序的基本思想是:每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到所有待排序记录全部插入为止。插入排序分为直接插入排序、二分插入排序(又称折半插入排序)、链表插入排序、希尔排序。今天主要介绍直接插入排序的实现。

直接插入排序是一种最简单的排序方法,其操作是将一条记录插入到已排好的有序表中,从而得到一条有序的记录。

特点

在直接插入排序中,内层的for循环数取决于待插记录与有序区之间的关系。最好情况是正序排列,比较一次,不移动,时间复杂度是O(n),最坏情况是逆序,时间复杂度O(n^2)。稳定排序。更适合于初始记录基本有序的情况。

步骤

现在有一个数组 r [49,38,65,97,76,13],需要通过直接插入排序进行排序。

  1. 设待排序的记录存放在数组 r[0..l]中, r[l]是我们已经排序好的数组。
  2. 循环 n-1 次,每次使用顺序查找法,查找r[i](i<=n),在已排好序的序列 r[l …i-1]中的插入位置,然后将 r[i]插入表长为 i-l 的有序序列 r[l …i-l]
初始关键字  (49)  38  65  97  76  13
i=2         (38   49) 65  97  76  13
i=3         (38   49  65) 97  76  13
i=4         (38   49  65  97) 76  13
i=5         (38   49  65  76  97) 13
i=6         (13   38  49  65  76  97) 

实现

javascript 版本

function InsertSort(L) {
    // 对数组L进行直接插入排序
    var temp;
    for(let i = 1; i<=L.length; i++) {
        if(L[i] < L[i-1]) {
            temp = L[i];        // 将待插人的记录暂存到监视哨中
            L[i] = L[i-1];      //r[i-1]后移
            for(var j=i-2; temp<L[j]; j--) {
                L[j+1] = L[j];
            }
            L[j+1] = temp;      // 将 temp即原L[i],插人到正确位置
        }
    }
    return L;
}