javaScript实现插入排序法Insertion Sort

原创 2018年04月17日 16:16:03

今天来用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实现算法和数据结构


DirectX5.0最新游戏编程指南 DirectDraw篇 二、DirectDraw的体系

二、DirectDraw的体系    多媒体软件要求高性能的图象。通过DirectDraw,Microsoft使得对图象敏感性的程序在速度和效率上都比在GDI上有了大大是提高,同时又保持了设备无关性,...
  • holyfire
  • holyfire
  • 2001-04-14 12:53:00
  • 1793

排序算法之插入排序<Insertion_Sort>及其C语言代码实现

概述 一个插入排序是另一种简单排序,它的思路是:每次从未排好的序列中选出一个元素插入到已排好的序列中。它的算法步骤可以大致归纳如下: 1. 从未排好的序列中选出一个元素,并把它赋值给temp变量...
  • gl486546
  • gl486546
  • 2016-11-06 08:57:52
  • 3447

插入排序(INSERTION-SORT) PYTHON实现

给定一个序列(如数组),使用插入排序。插入排序用生活中的例子,比如,向小学里面学生按身高排座位。学生无序排成一列,老师进行身高从低到高的排序。老师从第二个学生开始,空出第二个物理位置,开始与第一个学生...
  • rifengxxc
  • rifengxxc
  • 2017-05-24 13:28:30
  • 819

插入排序算法(Insertion Sort)的两种实现

插入排序算法的两种实现。
  • beiyeqingteng
  • beiyeqingteng
  • 2010-07-15 04:21:00
  • 3536

插入排序Sort a linked list using insertion sort in Java

Sort a linked list using insertion sort in Java package algorithm.sort; class ListNode { int ...
  • u013063153
  • u013063153
  • 2015-08-25 10:41:15
  • 736

Python 数据结构与算法——插入排序(insertion sort)

我们先归纳性地假设前 n−1n-1 个元素已经完成排序,现在要将第 nn 个元素插入到正确位置。如下为递归版的插入排序的代码清单:# n == len(seq)-1, seq[n] 表示序列的最后一个...
  • lanchunhui
  • lanchunhui
  • 2016-03-21 15:02:47
  • 964

算法导论—插入排序及Matlab实现

插入排序是《算法导论》中的第一个算法, 插入排序:Insertion-sort 输入:待排序数组A[1,···,n],长度为n 输出:按从小到大顺序排序好的数组算法思想:插入排序是最简单直观的排...
  • cindy79123
  • cindy79123
  • 2016-04-11 18:08:56
  • 301

数据结构 - 直接插入排序(Straight Insertion Sort) 详解 及 代码(C++)

直接插入排序(Straight Insertion Sort) 详解 本文地址: http://blog.csdn.net/caroline_wendy 具体参见: TAOCP, 第三卷(排序...
  • u012515223
  • u012515223
  • 2014-04-14 19:08:06
  • 3109

C++插入排序法(Insertion Sort)

// implementation of Insertion Sort (C++) #include using namespace std; void SwapTwo(int &a, int...
  • lijialinapple
  • lijialinapple
  • 2014-04-03 23:38:52
  • 1775

Java 插入排序(Insertion Sort)

插入排序 代码插入排序插入排序(Insertion Sort)的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^...
  • fangyaoyu
  • fangyaoyu
  • 2015-12-03 09:39:45
  • 576
收藏助手
不良信息举报
您举报文章:javaScript实现插入排序法Insertion Sort
举报原因:
原因补充:

(最多只允许输入30个字)