排序算法之二(插入排序)
Hello,大家好。忙了两天,今天终于有时间更新了,本期我主要讲解排序算法中的插入排序。
插播一条小惊喜,在写这篇文章时候,收到了心仪导师的回信,是我想要学习和研究的方向,起初调剂时候特别不甘,后来慢慢接受了这个结果,甚至现在开始期待研究生生活。意外的惊喜真的让人好开心,期待广州学习生活。
如果我的文章对您有帮助,希望可以帮忙转发,点击在看,给我更多的创作动力。
每周更新至少两篇。
· 插入排序原理 ·
插入排序非常好理解,对于给定的一组记录,初始时假设第一个记录自成一个有序序列,其余的记录为无序序列。接着从第二个记录开始,按照记录的大小一次将当前处理的记录插入到之前的有序序列中,直到最后一个记录插入到有序序列中为止。算法的原理如下:
(1)设置监视哨r[0],将待插入记录的值赋值给r[0];
(2)设置开始查找的位置j;
(3)在数组中进行搜索,搜索中将第j个记录后移,直至r[0] ≥ r[j]为止;
(4)将r[0]插入到r[j +1]的位置上;
以数组[38, 65, 97, 76, 13, 27, 49]为例,直接插入排序具体步骤如下:
第一步插入38以后:[38] 65 97 76 13 27 49
第二步插入65以后:[38 65] 97 76 13 27 49
第三步插入97以后:[38 65 97] 76 13 27 49
第四步插入76以后:[38 65 76 97] 13 27 49
第五步插入13以后:[13 38 65 76 97] 27 49
第六步插入27以后:[13 27 38 65 76 97] 49
第七步插入49以后:[13 27 38 49 65 76 97]
根据以上的原理,实现代码如下:
· 代码实现 ·
function insertSort(arr) {
var tmp;
for(var i = 1; i < arr.length; i++) {
tmp = arr[i];
for(var j = i - 1; j >= 0; j--) {
if(tmp < arr[j]) {
arr[j + 1] = arr[j];
arr[j] = tmp;
} else {
break;
}
}
}
return arr;
}
var arr = [38, 65, 97, 76, 13, 27, 49], txt = "";
for(var k in arr) {
txt += arr[k] + " ";
}
console.log("排序前:" + txt);
arr = insertSort(arr);
txt = "";
for(k in arr) {
txt += arr[k] + " ";
}
console.log("排序后:" + txt);
算法的复杂度分析:
(1)最佳情况:T(n) = O(n),当输入数组按升序排列,则是最佳情况。
(2)最差情况:T(n) = O(n^2),当输入数组按降序排列是最差情况。
平均时间复杂度O(n²),空间复杂度O(1),占常数内存,不占额外内存,是一种稳定性的算法。
· 代码优化思路 ·
在查找插入位置时使用二分查找算法
function insertSort2() {
var key, left, right, middle;
for(var i = 1; i < arr.length; i++) {
key = arr[i];
left = 0;
right = i - 1;
while(left <= right) {
middle = Math.floor((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 = [38, 65, 97, 76, 13, 27, 49], txt = "";
for(var k in arr) {
txt += arr[k] + " ";
}
console.log("排序前:" + txt);
arr = insertSort2(arr);
txt = "";
for(k in arr) {
txt += arr[k] + " ";
}
console.log("排序后:" + txt);
每日鸡汤
热爱技术,坚持共享。
SLIGHT HEAT #2021#
Mose前端
新浪微博
CuiXin992173697