javaScript实现插入排序法Insertion Sort

今天来用JavaScript来简单实现一下插入排序的算法思想,并提供了一种优化思路。

插入排序法Insertion Sort的简单思想介绍

照例先简单介绍一下插入排序的算法思想。插入排序的思想也非常简单,有点像我们平时在玩扑克牌时整理牌的思路。我们现在有一串数组:3,2,5,1,6,4,7。在插入排序时,第一项是固定不动的,我们从第二项开始,拿出这个数字来和前一项进行大小的比较,如果比前一项小,则交换两个数字的位置,一直到数组的最前端;而如果比前一项数字大时,则保持不动。不难发现,在编程中,插入排序的算法思想比选择排序的计算量要减少很多。插入排序的算法思想是不断改变排序的参考基准点,从减少遍历的数量,提前终止循环。比起选择排序拿固定顺位的数字,来遍历剩余所有数字比大小的方式,快速了不少。

直观的插入排序法的实现

  介绍完了思路,我们现在先来顺着思路来简单实现一下快速排序的算法。我们照例先来声明一个数组,var arr = [3,2,1,6,4,5,9,8]; 数组长度和数组顺位都是随机的,这里只是简单插入一个数组,以便后续书写代码测试。

  建立第一个for循环用来遍历整个数组来进行排序,此处注意,插入排序是从数组的第二位开始进行排序的算法思想,需要数组第一位为基准点。因此此处,我们作为数组index值的i应该是从1开始,而不是从0开始。

  接下来我们建立第二个for循环,用来表示进行比较的过程。声明新变量j,来等同于i,而进入循环的条件为1、需要一直比较到数组第0项。2、比较发现该数字大。我们与循环条件j>0与上arr[j - 1] > arr[j]来表示进入循环的条件。如果进入循环,就是说明arr[j]需要和前一项进行交换。我们再在内部加上简单的中间值法交换两项值,就完成我们的代码书写。


  我们来console.log一下arr,验证下结果的正确性。一个非常直观的插入排序的代码就完成了。

  

插入排序法的一种优化思路

  但是我们仔细思考一下,如果一个数字是数组中最小的,他恰巧出现在数组的最后,那么根据我们的算法逻辑,我们需要从数组的最后一项开始,一重复三个赋值结构一直到数组的最前端,这个运算是不是实在太麻烦了。我们是不是可以讲这个数值拿出来for循环外面,然后在达到要求条件时不断通过比较让该数字的前一项等于后一项,再最后完成赋值,是不是就可以将for循环中不断的三个赋值变为一个,大大减少运算量。

  简单来说,我们拿回排序前的arr数组来形象介绍下这种思路。

arr = [3,2,1,6,4,5,9,8];在这个数组中,比如我们第二项2,我们先将2的值拿出放在一旁,然后让3和2进行比较,3比2大,将3赋值给arr[1],然后到了数组第0项,结束比较,将2的值赋予给数组的第0项。再比如第三项1,我们将1的值拿出储存,接着进行前一项的比较,比前一项2小,那么我们只需在循环体中书写一个赋值,将arr[1]的值赋值给arr[2]。再通过比较将arr[0]的值赋值给arr[1].比较完成后,将当前的arr[0]的值赋值为刚刚拿出的1的值就可以结束。那么我们简单来更改一下刚刚书写的代码。

优化代码

  首先我们快速书写一下不变的外层for循环代码。接着我们需要声明一个变量,来储存当前拿出来进行排序的数组的值,所以我们声明一个m,让var m = arr[i];。


  建立第二个for循环,变量值和进入循环条件和刚才依旧相同,不同的是,我们只需要将满足条件的j的前一项数组的值,变到当前数组位置就可以了,不用利用中间量进行三次赋值交换。

  最后我们在完成该村循环后的当前arr[j]的值就应该是刚刚用m拿出来的值,因此我们让arr[j] = m。

  完成算法优化思路的函数书写,对比第一次书写的函数,我们让for循环内部节省了两步的赋值操作,将这个赋值操作拿出来放在外部进行,代码量虽然没有减少多少,但是大大优化了运算的效率。

返回博客javaScript实现算法和数据结构


阅读更多
上一篇javaScript实现选择排序Selection Sort
下一篇JavaScript基础重点记忆和理解概念整理
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭