zoukankan      html  css  js  c++  java
  • 数组的冒泡排序

    首先我们要理解排序的定义:

    冒泡排序(Bubble sort):相邻的两个数逐个的做比较,如果前一个数比后一个数小那么就交换过来,当第一轮比较完毕之后最小的值一定在末尾

    我们可以先画出以一张图:

    数组两个相邻的值去比较后面的数大于前面的数就会去交换,因此每轮比较后最小值都会出现在这次比较的最后一位

    第二次比较:

    第三次比较:

    第四次比较:

    好了,上面就是我们模拟计算机去比较一个数组;既然我们知道了如何去比较数组

    那么我们该如何去编写代码,让计算机会自动去比较呢?

    这就要发挥我们自己的创造能力以及独特的思维,言归正传,我们到底该如何写出这个冒泡排序呢?

    接下来就由我就来简单的演示一下吧!

    例子1:

    这个就是最简单的交换方法

    我们看到这个方法:

    Q:第一个for循环为什么从1开始,以及为什么是这个循环条件?

    A:从1开始是因为外层循环代表的是比较轮数,不可能有第0轮这个东西把

        循环条件是由上面的表格观察而出来的,比较轮数是小于这个数组的长度的

    Q:第二个for循环从为什么从0开始,以及这个循环条件

    A:因为第二个循环代表的是每一轮比较的次数,从0开始是也代表要交换的索引

         既然我们知道了这个循环代表的是比较次数,从上面的表格中可以得出这么一个结论

        交换次数  = 数组长度 - 当前轮数

       因为是从0开始的所以就要小于这个值,这就是我们的循环条件

    最后if中的就好理解了加入后一个索引的数大于当前索引数,就去交换这两个数。

     例子2:

    利用求极值的思路去做冒泡排序

     这是第一次写出的结果:

    其实我们发现这个数组其实在第5行的时候就交换好了

    可是程序并不会因此停下来,然后继续交换从而得到了意外的结果

    那么怎么来判断这个数组是否已经排好序了,从而去停止整个循环

    没错,就是然后判断数组是否从大到小排好序了呢?

    这里我使用了一个方法:

    我们来看到这个方法:

     

    我们默认这个数组是循序排序的,所以结果为true

    然后开始循环:

    假如有前面索引的数小于后面索引数,就说明这个数组不是降序排列的

    就把结果改为false,并且跳出循环

    这就是我们判断数组是否降序排列的一个方法,

    如果判断是否为升序排列的话,只需把if中的小于号换成大于号还即可

     利用这个方法得出的结果是这样子的:

    这就是我们所期望的结果。

    接下来就是给出整个代码:

     

    这里要说明一下:

    ArrayDemo.printArray方法其实就是一个遍历数组的方法

    为了节省时间就直接调用过来了

    我们也可以把上面的冒泡排序优化一下,和例子2也是一样的思路

    如图:

     

    最后在看一下这两种方法的耗时:

    差不多就是这样子了

  • 相关阅读:
    SourceInsight工具增强——AStyle(代码格式化)、PC-Lint(静态检查)
    读《Top benefits of continuous integration》有感
    授人以鱼不如授人以渔——和女儿学一起学成语
    Linux内存使用情况以及内存泄露分析之工具与方法
    常用gcc选项
    KVM内核文档阅读笔记
    关于Linux虚拟化技术KVM的科普 科普五(From 世民谈云计算)
    关于Linux虚拟化技术KVM的科普 科普四(From humjb_1983)
    关于Linux虚拟化技术KVM的科普 科普三(From OenHan)
    关于Linux虚拟化技术KVM的科普 科普二(KVM虚拟机代码揭秘)
  • 原文地址:https://www.cnblogs.com/menghujava/p/9854377.html
Copyright © 2011-2022 走看看