vlambda博客
学习文章列表

排序算法之二(插入排序)

排序算法之二(插入排序)

        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