「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」
介绍
插入排序的基本思想是:每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到所有待排序记录全部插入为止。插入排序分为直接插入排序、二分插入排序(又称折半插入排序)、链表插入排序、希尔排序。今天主要介绍直接插入排序的实现。
直接插入排序是一种最简单的排序方法,其操作是将一条记录插入到已排好的有序表中,从而得到一条有序的记录。
特点
在直接插入排序中,内层的for循环数取决于待插记录与有序区之间的关系。最好情况是正序排列,比较一次,不移动,时间复杂度是O(n),最坏情况是逆序,时间复杂度O(n^2)。稳定排序。更适合于初始记录基本有序的情况。
步骤
现在有一个数组 r [49,38,65,97,76,13],需要通过直接插入排序进行排序。
- 设待排序的记录存放在数组
r[0..l]中,r[l]是我们已经排序好的数组。 - 循环 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;
}