zoukankan      html  css  js  c++  java
  • 我也来聊一下冒泡排序

    有一个数组 :

    int array [] = {5,4,3,2,1};

    现在要求从小到大进行排序,那么我们可以想象排序过后 应该是 {1,2,3,4,5}

    那么 冒泡排序 的原理就是 :

    每比较一轮,就把最大的放到最后面,这也是冒泡名称的由来。

    那么我们先做第一轮比较吧!

    for (int i = 0; i < a.length - 1; i++){
        if(a[ i ] > [a + i]){ //如果a[i] 比 a[i+1]大的话,二者就交换顺序
            int temp = a[ i + 1];
            a[i + 1] = a[ i ];
            a[ i ] = temp;
        }   
    }    

    来细分一下 这个比较的过程 :

     i = 0 ,a[0] 和 a[1]比较,完成后数组的顺序应该是 :

    4,5,3,2,1

     i = 1 ,a[1] 和 a[2]比较,比较完以后,数组的顺序应该是 :

    4,3,5,2,1

    i = 2, a[2] 和 a[3]比较,比较完以后,数组的顺序应该是:

    4,3,2,5,1

    i = 3, a[3] 和 a[4]比较,比较完以后,数组的顺序应该是:

    4,3,2,1,5

    当i=4的时候,由于要判断 i<a.length - 1,不满足,故退出比较。

    所以第一轮比较完以后,数组的顺序应该是 {4,3,2,1,5}.

    此时对比结果,还需要比较,那么到底需要比较几轮呢?几轮呢?轮呢?呢~~~~??

    如果 “每次把最大的数字冒到最后去” 算一轮的话,那么在最极端情况下[比如本例],那么应该是n-1轮,那么又有同学问了,为什么是n-1轮呢?

    那再举个例子,2个数字 {2,1}比较的话,把大的放后面去要几轮呢?1轮,也就是 2 - 1 轮,呵呵,推广一下就是 n - 1轮了。

    所以 冒泡的代码应该是这个样子的 :

    1 for(int j = 0 ; j < a.length - 1; j++){ // a.length - 1 标示 n - 1轮
    2     for (int i = 0; i < a.length - 1; i++){
    3      if(a[ i ] > [a + i]){ //如果a[i] 比 a[i+1]大的话,二者就交换顺序
    4          int temp = a[ i + 1];
    5          a[i + 1] = a[ i ];
    6          a[ i ] = temp;
    7      }   
    8   } 
    9 }

    到这里冒泡其实已经结束了。

    但是其实还有一个优化空间。。。

    我们前面已经发现,

    经过第一轮排序,最大的一个已经到最后一个位置了。。

    经过第二轮排序,次大的一个已经到倒数第二个位置了。。

    以此类推,所以每经过一轮排序,那么“对应的倒数位置”的数字其实已经不用对比了。。。

    比如 经过第一轮排序,那么在进行第二轮排序的时候,倒数第一个其实已经不用对比了,因为再第一轮排序的时候,已经非常明确,最后一个就是最大的了。。

    素以这里就有一个优化的地方 :

     for(int j = 0 ; j < a.length - 1; j++){ // a.length - 1 标示 n - 1轮
         for (int i = 0; i < a.length - 1 - j; i++){//这里减去一个 " j" ,那么每次比较 “对应的倒数位置”的数字就不会对比了
          if(a[ i ] > [a + i]){ //如果a[i] 比 a[i+1]大的话,二者就交换顺序
              int temp = a[ i + 1];
              a[i + 1] = a[ i ];
              a[ i ] = temp;
          }   
       } 
     }

    到这里冒泡应该比较完整了,那么自己写的代码自己肯定要测试的啦。。

    那么怎么测试呢 ?

    我来写几个用例吧 ,直接写数组元素吧 :

    a [] = {};

    a [] = {0};

    a [] = {-1,-2,0,2,1}

    a [] = {5,4,3,2,1}

    a [] = {1,2,3,4,5}

    面试经常被问到。。而且因为这个错过了几个很好的机会。希望以后不会再因为这个被刷了,呵呵,2015,好运常来~

  • 相关阅读:
    JAVA并发编程学习笔记之ReentrantLock
    服务架构演进
    Java集群优化——dubbo+zookeeper构建高可用分布式集群
    Dubbo实例
    hessian学习
    JAVA分布式事务原理及应用
    了解AngularJS $resource
    AngularJS Resource:与 RESTful API 交互
    Hibernate解决高并发问题之:悲观锁 VS 乐观锁
    互联网金融高并发方案
  • 原文地址:https://www.cnblogs.com/woxiangbo/p/4624907.html
Copyright © 2011-2022 走看看