插入排序(Insertion Sort)

它是通过不断将未排序数据插入有序序列,一次次循环加入待排序数据扩充有序序列部分,来达到最终的排序目的。很像我们平时发牌时一张张整牌的过程:我的习惯是先把最左边第一张作为有序部分,之后每拿取一张牌进行大小比较,按照升序或降序的方式整理好手里的牌(构建整个有序部分)。 在众多算法的使用对比中,通常在量级小于千的情况下使用插入排序还是令人满意的。


时间复杂度:

若一趟扫描即可完成排序。所需的关键字比较次数 和记录移动次数 均达到最小值时 ,有最好时间复杂度为:O(n)。反之,最坏时间复杂度为;O(n^2)。

排序的稳定性

在插入排序的整个过程中,不断插入待排序数据扩充有序部分,不会改变相同数据的相对位置,所以 是一种 稳定的排序算法。若需要更多讲解举例解释可以看看这个内容 :从VB来看-排序

来看看下面的例子,再次了解一下插入的过程。




视频来自网络-Métodos de Ordenação


从VB来看-插入排序

这是VB-插入排序(互换式)

通过对上图排序过程的了解可以有下面的VB代码。
做了思路的注释,若有什么疑问可以留言。

Sub Insertion(MyArray(), ByVal nOrder As Integer)
Dim NextElement   '定义将要插入的数据在数组中的位置
Dim Index         '定义将要比较的数据在数组中的位置
Dim TEMP          '定义在执行数据交换时的临时变量'将数组第一位做为有序部分,那将要插入的数据可以位于数组第二位
NextElement = LBound(MyArray) + 1    '记录要插入的数据的位置         While (NextElement <= UBound(MyArray))    '判断是否还有待插入数据Index = NextElement                 '记录将进行比较的数据位置DoIf Index > LBound(MyArray) Then        '判断比较的数据位置是否到数列尽头If nOrder = ASCENDING_ORDER Then   '判断是否选择升序排列If MyArray(Index) < MyArray(Index - 1) Then   '判断插入数据是否小于有序部分TEMP = MyArray(Index)                     '数据交换MyArray(Index) = MyArray(Index - 1)MyArray(Index - 1) = TEMPIndex = Index - 1                         '移动比较位置ElseExit Do                                   '退出循环-完成一次插入数据                  End IfElseIf nOrder = DESCENDING_ORDER Then              '判断是否选择降序排列If MyArray(Index) >= MyArray(Index - 1) Then   '判断插入数据是否小于有序部分TEMP = MyArray(Index)                      '数据交换MyArray(Index) = MyArray(Index - 1)MyArray(Index - 1) = TEMPIndex = Index - 1                          '移动比较位置ElseExit DoEnd IfEnd IfElseExit Do                                            '退出循环-完成一次插入数据                  End IfgIterations = gIterations + 1                          '记录循环次数LoopNextElement = NextElement + 1                              '移动到下一位插入数据gIterations = gIterations + 1                              '记录循环次数Wend

有了上图生动的过程,再来看一个例子,想想有什么不同


图片来自维基百科

这是VB-插入排序(平移式)

通过对上图排序过程的参考可以有下面的VB代码。

Sub Insertion(MyArray(), ByVal nOrder As Integer)
Dim NextElement   '定义将要插入的数据在数组中的位置
Dim Index         '定义将要比较的数据在数组中的位置
Dim TEMP          '定义在执行数据交换时的临时变量'将数组第一位做为有序部分,那将要插入的数据可以位于数组第二位
NextElement = LBound(MyArray) + 1           '记录要插入的数据的位置 While NextElement <= UBound(MyArray)    '判断是否还有待插入数据TEMP = MyArray(NextElement)          '刷新要插入的数据的位置Index = NextElement - 1              '记录将进行比较的数据位置DoIf Index >=LBound(MyArray) Then             '判断比较的数据位置是否到数列尽头If nOrder = ASCENDING_ORDER Then         '判断是否选择升序排列If TEMP < MyArray(Index) Then         '判断插入数据是否小于有序部分MyArray(Index + 1) = MyArray(Index)   '有序部分为插入数据移出空位Index = Index - 1   '移动到更小的有序数据位置Else: Exit Do       '退出循环-(已找到插入数据位置合理位置)End IfElseIf nOrder = DESCENDING_ORDER Then    '判断是否选择降序排列If TEMP > MyArray(Index) Then         '判断插入数据是否大于有序部分MyArray(Index + 1) = MyArray(Index)   '有序部分为插入数据移出空位Index = Index - 1   '移动到更大的有序数据位置Else: Exit Do       '退出循环-(已找到插入数据位置合理位置)End IfEnd IfElse: Exit Do             '退出循环-(已找到插入数据位置合理位置)      End IfLoopMyArray(Index + 1) = TEMP       '插入数据NextElement = NextElement + 1   '移动到下一位待插入数据位置gIterations = gIterations + 1   '记录循环次数Wend

从VB来看-InsertionSort(VB插入排序)相关推荐

  1. VB→C++→C#→VB.NET,语言的共性和个性

    从当初的误打误撞学习VB之后就一发不可收拾,直到现在接触VB.NET,想想自己也经历了VB→C++→C#→VB.NET这四种计算机语言,在此并不是想说自己学语言的多少,因为语言并不在于多而在于精,很惭 ...

  2. VB.net:VB.net编程语言学习之添加引用打包安装项目的简介、案例应用之详细攻略

    VB.net:VB.net编程语言学习之添加引用&打包安装项目的简介.案例应用之详细攻略 目录 关于添加引用 1.SW的二次开发,需要引用多个Solidworks库文件即dll文件

  3. VB.net:VB.net编程语言学习之操作符(变量/常量/数据类型/声明)逻辑控制语句(条件判断/循环语句)的简介、案例应用之详细攻略

    VB.net:VB.net编程语言学习之操作符(变量/常量/数据类型/声明)&逻辑控制语句(条件判断/循环语句)的简介.案例应用之详细攻略 目录 VB.net编程语言学习之操作符/变量/常量/ ...

  4. 不同编程语言代码转换网站,在线编程语言代码转换,C#转VB.NET,VB.NET转C#

    不同编程语言代码转换网站,在线编程语言代码转换 C#转VB.NET,VB.NET转C# 推荐一个国外不错的编程代码转换网站 http://www.developerfusion.com/tools/c ...

  5. 运行中调试初计算机的命令,计算机二级 VB辅导:VB中程序的运行调试

    1.运行程序 运行程序,可用下列方法之一: (1)选择主窗口的"运行"菜单的"启动"命令. (2)按快捷键F5. (3)选择工具栏上的启动按钮. 在程序运行过程 ...

  6. 计算机vb实验感想,VB学习心得体会

    VB学习心得体会 VB学习心得体会 VB是一门程序设计语言,也需要一定的英语基础.VB既能充实我们的生活,武装我们的头脑,锻炼我们的意志,又能在以后需要的时候成为帮助我们成功的推进动力.对于VB的学习 ...

  7. VB.net:VB.net编程语言学习之基于VS软件利用VB.net语言实现对SolidWorks进行二次开发的简介、案例应用之详细攻略

    VB.net:VB.net编程语言学习之基于VS软件利用VB.net语言实现对SolidWorks进行二次开发的简介.案例应用之详细攻略 目录 调用SolidWorks功能简介 1.宏录制步骤 (1) ...

  8. 计算机vb实验报告,VB综合实验报告格式

    <VB综合实验报告格式>由会员分享,可在线阅读,更多相关<VB综合实验报告格式(5页珍藏版)>请在人人文库网上搜索. 1.华北科技学院计算机系综合性实验实 验 报 告 课程名称 ...

  9. 大学python和vb哪个简单-vb和python哪个速度快

    Python好学,易上手.如果你是第一次学习计算机编程语言,推荐你学这个.更重要的是,学会这门语言,也能方便你对电脑中的文档进行处理.VB,面对大多数任务,编码速度都不及Python的. VB能快速的 ...

最新文章

  1. 如何加快Json 序列化?有哪些方法?
  2. Android Studio如何减小APK体积
  3. 主流微服务注册中心浅析和对比
  4. Android 使用AsyncTask 后监听异步加载完毕的动作
  5. Atitit attilax提出的软件开发发展趋势与概念 1. 长期化 复用化 跨平台 可移植性 1 2. 通用化 通用 化的渠道至少有3种 1 2.1. 模块化 1 2.2. 标准化接口 1 2
  6. pygame安装时出现的问题以及解决方案记录.
  7. 【树莓派】USB摄像头+python+opencv
  8. 22条创业军规,让你5分钟读完《创业维艰》
  9. 计算几何与计算机图形必备书单整理
  10. 【原创】小时候特别喜欢玩的强手棋游戏
  11. jenkins定时构建
  12. linux服务器默认多久断开ssh,SSH超时自动断开问题解决
  13. 实现74LVC161的计数器功能
  14. php判断0点到7点凌晨时间段的方法
  15. 《FFmpeg从入门到精通》读书笔记(五)
  16. 精华【分布式微服务云架构dubbo+zookeeper+springmvc+mybatis+shiro+redis】分布式大型互联网企业架构!
  17. Windows和Linux简单命令的总结
  18. 计算最大公约数(GCD)
  19. linux 自动mv脚本,linux replace rm to mv(脚本)
  20. 小程序|炎炎夏日、清爽一夏、头像大换装

热门文章

  1. 在JSP中连接数据库及使用
  2. DFA确定化和最小化
  3. DorisDB系列文档(三)基本原理
  4. java执行sql列名无效_JAVA 里查找SQL数据 列名无效
  5. 如何在idea中配置SVN
  6. 【freemarker】常用空判断??和has_content的区别
  7. Mysql之浅析INSERT ON DUPLICATE
  8. 培训机构管理信息系统设计与开发(一)
  9. 大容量Flash型AT91系列ARM核微控制器
  10. 概率密度变换公式 雅可比矩阵_雅可比行列式【1】定义及一些推导