冒泡排序

注意点

  • 越界问题:i的边界是n-1,也就是说是对总共的第1~n个数进行排列(最后一个数处于被比较状态,不需要额外主动比较);j的初始值或最终值与当前i的值

    有关题目中往往会改变i的值来考察,拿j的值来填空
  • 升降序问题:取决于j循环if比较
  • 循环次数:n-1 两两比较次数:n(n-1)/2

初级代码

For i=1 to n-1
     For  j= n to i+1  step -1
            If d(j)<d(j-1)  then
                 t=d(j): d(j)=d(j-1):d(j-1)=t
            End If
     Next j
Next i

变式

  • 遍数优化

原理:先立一个flag,如果当前这遍循环中有进行过交换,则改变flag的值;如果一直没有进行交换,即数列已有序,则退出循环

For i=1 to n-1
     flag=true 'new
     For  j= n to i+1  step -1
            If d(j)<d(j-1)  then
                 t=d(j): d(j)=d(j-1):d(j-1)=t
                 flag=false 'new
            End If
     Next j
     if flag=true then Exit For 'new
Next i
  • 范围优化

原理:基于遍数优化版本上的再次优化(遍数优化当然可以修改成do while形式的)。last用于锁定最近且最后一次修改的地方,flag效果同遍数优化。下一次循环只需要遍历last~n之间的数字即可。

Do while flag=true 'new
     last=1:flag=true 'new
     For  j= n to last+1  step -1
            If d(j)<d(j-1)  then
                 t=d(j): d(j)=d(j-1):d(j-1)=t
                 m=j 'new
                 flag=false 'new
            End If
     Next j
     last=m'new
Loop
  • 双向排序

原理:说白了就是一个升序一个降序的俩普通冒泡并在一起,但是一个从头一个从尾开始遍历。由于内部的for是并列的,所以粗略地看,时间复杂度并没有变化,但却将比较遍数缩小成其1/2。个人觉得只适用于n为偶数的情况,

因为如果像下面的代码一样,中间必有一个孤儿没有排到。(visual basic中的/是向上取整,\是向下取整)

For i=1 to n/2
     For  j= n-i+1 to i+1  step -1
            If d(j)<d(j-1)  then
                 t=d(j):d(j)=d(j-1):d(j-1)=t
            End If
     Next j
     For  j= i+1 to n-i  step -1
            If d(j)<d(j+1)  then
                 t=d(j):d(j)=d(j-1):d(j-1)=t
            End If
     Next j
Next i
  • 单层循环

下面这个是第一种单层循环冒泡,来自于老师的PPT,不大理解

Do While i <= n
    If i=0 or a(i-1)<=a(i) Then
        i=i+1
    Else i<>0 And a(i-1)>a(i)'感觉这个else简直废话
        t=a(i-1):a(i-1)=a(i):a(i)=t
        i=i-1
    End If
Loop

原理:若该趟for循环结束将给i赋值-1,并且将team的长度减1,继续下趟循环

下面这个思路来源于这条博客,将c++改成了visual basic

team=n-1
For i=0 To team
    If a(i)>a(i+1) Then
        t=a(i):a(i)=a(i+1):a(i+1)=t
    End If
    If i=team-1 Then
        i=-1:team=team-1
    End If
Next i

[Visual Basic]冒泡排序及优化的更多相关文章

  1. 特性(C# 和 Visual Basic)

    特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集.类型.方法.属性等)相关联. 特性与程序实体关联后,即可在运行时使用名为“反射”的技术查询特性. 有关更多信息,请参见 反射(C# 和 V ...

  2. 杂项-软件: VBA(Visual Basic for Applications)

    ylbtech-杂项-软件: VBA(Visual Basic for Applications) VBA (Visual Basic宏语言) Visual Basic for Application ...

  3. 使用 Async 和 Await 的异步编程(C# 和 Visual Basic)[msdn.microsoft.com]

    看到Microsoft官方一篇关于异步编程的文章,感觉挺好,不敢独享,分享给大家. 原文地址:https://msdn.microsoft.com/zh-cn/library/hh191443.asp ...

  4. Visual Basic 2012 借助DataGridView控件将SQL server2012 数据导入到Excel 2010

    摘  要: SQL Server 2012 数据和Excel 2010之间的连接和数据的传输,本篇文章主要针对的是SQL Server 2012 数据导入到Excel 2010文件中.Excel软件对 ...

  5. Visual Basic 2012 借助DataGridView控件将Excel 2010数据导入到SQL server 2012

    (注:注释的颜色原本为绿色,在这里变为黑色,有点不便,但不会造成阅读影响.放入Visual Basic2012代码编辑器后会还原成绿色.) 摘  要:DataGridView控件作为数据传输的中介,只 ...

  6. Delphi、C C++、Visual Basic数据类型的对照 转

    Delphi.C C++.Visual  Basic数据类型的对照 变量类型 Delphi C/C++ Visual Basic 位有符号整数 ShortInt char -- 位无符号整数 Byte ...

  7. 2016年4月TIOBE编程语言排行榜 Visual Basic正渐行渐远

    COBOL, BASIC 和 FORTRAN 很长一段时间作为主力开发语言被使用.有很多软件使用这些语言来编写,并且发展的不亦乐乎.然而经过多年的发展,COBOL和FORTRAN逐渐被抛弃, 而得益于 ...

  8. Visual Basic相关图书推荐

    Visual Basic从入门到精通(第2版) 作      者 国家863中部软件孵化器 编 出 版 社 人民邮电出版社 出版时间 2015-03-01 版      次 2 页      数 61 ...

  9. 演练:Office 编程(C# 和 Visual Basic)

    https://msdn.microsoft.com/zh-cn/library/ee342218(v=vs.110).aspx PIA的全称是 primary interop assembly  主 ...

随机推荐

  1. js 实现排序算法 -- 归并排序(Merge Sort)

    原文: 十大经典排序算法(动图演示) 归并排序 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得 ...

  2. 云服务器 ECS--查找公网ip使用终端连接云服务

    前段时间购买了阿里云服务器,购买之后一直没用使用,今天来操作一波,可谓一波三折,只能说,不看他们的操作指南你可能连地方都找不到,所以,在这里,我想给初次购买阿里云服务的童鞋门,写写我是怎么使用阿里云服 ...

  3. js实现数组去重怎么实现?

    方法1. 创建一个新的临时数组来保存数组中已有的元素 var a = new Array(1,2,2,2,2,5,3,2,9,5,6,3); Array.prototype.unique1 = fun ...

  4. NoneBot+酷Q,打造QQ机器人

    NoneBot 是一个基于 酷Q 的 Python 异步 QQ 机器人框架,它会对 QQ 机器人收到的消息进行解析和处理,并以插件化的形式,分发给消息所对应的命令处理器和自然语言处理器,来完成具体的功 ...

  5. 5种方法获取url中文件的扩展名

    /** * strrchr - 查找指定字符在字符串中的最后一次出现 * strrpos — 计算指定字符串在目标字符串中最后一次出现的位置 * end — 将数组的内部指针指向最后一个单元 * pa ...

  6. gedit搭建c开发环境

    在管理外部工具中,创建启动脚本 #!/bin/sh DIR=$GEDIT_CURRENT_DOCUMENT_DIR NAME=$GEDIT_CURRENT_DOCUMENT_NAME /home/lx ...

  7. Nginx 配置GeoIP2 禁止访问,并允许添加白名单过滤访问设置

    配置环境:Centos 7.6 + Tengine 2.3.2 GeoIP2 下载地址:https://dev.maxmind.com/geoip/geoip2/geolite2/ 1. Nginx  ...

  8. SpringCloud入门(六): Hystrix监控

    Hystrix.stream 监控 <!--. 配置pom文件,引入actuator包--> <dependency> <groupId>org.springfra ...

  9. golang在debian下不能用sudo进行使用的问题

    sudo ln -s /usr/local/go/bin/go /usr/bin/go 然后就ok了. 去查了下这两个路径的差别,也没查出什么.只是说/usr/bin 是系统预装所在的路径.

  10. 使用nestjs集成grpc具体操作

    两个程序中, 提供grpc服务的称为服务端, 调用grpc服务的为客户端, 以下是grpc服务端和客户端的代码编写     1. 创建两个nestjs项目demo1(端口: 3000)和demo2(端 ...