对冒泡排序的理解和实例

Java冒泡排序

  冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

  冒泡排序算法的运作如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

    有一个数组 :

    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;
          }
       }
     }

时间: 2024-08-26 14:43:15

对冒泡排序的理解和实例的相关文章

Socket 的理解及实例

Socket 的理解及实例Socket 的理解TCP/IP要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何再它们之间传输的标准,从字面意思来看TCP/IP是TCP和IP协议的合称,但实际上TCP/IP协议是指因特网整个TCP/IP协议族.不同于ISO模型的七个分层,TCP/IP协议参考模型把所有的TCP/IP系列协议归类

冒泡排序深入理解

冒泡排序深入理解 对于冒泡排序有一个小性质: 每一次都会把序列未排好序的最大数"沉底", 即推到序列尾部 1.P4378 Out of Sorts S 留意着农场之外的长期职业生涯的可能性,奶牛Bessie开始在不同的在线编程网站上学习算法. 她到目前为止最喜欢的算法是"冒泡排序".这是Bessie的对长度为N的数组A进行排序的奶牛码实现. sorted = false while (not sorted): sorted = true moo for i = 0

javascript闭包的理解和实例

所谓闭包,值得是词法表示包括不必要计算的变量的函数,也就是说,该函数可以使用函数外定义的变量. 顺便提示一下: 词法作用域:变量的作用域是在定义时决定而不是执行时决定,也就是说词法作用域取决于源码,通过静态分析就能确定,因此词法作用域也叫做静态作用域. with和eval除外,所以只能说JS的作用域机制非常接近词法作用域(Lexical scope). 下面是一个简单的使用全局变量的闭包实例: 1 var sWord="Hello,Welcome to web前端开发工程师的博客,请多多指教.&

冒泡排序的理解

每次准备面试,都要看下冒泡算法,因为不会!工作三年多,这个算法算个试题吧,每次死记硬背,却没有理解,悲哀啊,其实也没多复杂,代码几行,第一个循环,代表比较次数,多少个数,就比较多少次-1,int i=0;i<a.length-1;i++这个是控制循环的.从第一个数开始比,比较几次呢,假如两个数,比较一次,假如三个数,二次,规律是减一,第二个循环,控制指针,从第几个数开始比,先看语法int j=0:j<a.length-1-i;j++,第一次循环.把第一个数和后面每一个数比较,第二次循环,把第二

[Sqlite]--&gt;嵌入式数据库事务理解以及实例操作

SQLite 事务(Transaction) 事务(Transaction)是一个对数据库执行工作单元.事务(Transaction)是以逻辑顺序完成的工作单位或序列,可以是由用户手动操作完成,也可以是由某种数据库程序自动完成. 事务(Transaction)是指一个或多个更改数据库的扩展.例如,如果您正在创建一个记录或者更新一个记录或者从表中删除一个记录,那么您正在该表上执行事务.重要的是要控制事务以确保数据的完整性和处理数据库错误. 实际上,您可以把许多的 SQLite 查询联合成一组,把所

有关快速排序和冒泡排序的理解

冒泡排序:将第一位的值与后面所有的值比较,碰到小的就与其交换,第一次循环得到最小的数,再对后面的数循环,得到最小的数,依次下去,复杂度为o(n*n): 快速排序:将第一位的值与后面的值比较,得到这个值在数组中的准确位置,第一次循环与冒泡排序的复杂度式一样的,都是n,可循环之后把数组分为两个数组,继续对两个数组排序.复杂度为log2(n)*n~n*n. 那么为什快速排序会比冒泡排序快呢? 本质原因是快速排序将每一步比较的信息都利用了,而快速排序则丢失了一些比较的信息.为将两种排序类比为一个全国打架

JSONP 理解 和 实例 讲解

1.什么是jsonp 1.1 同源策略 浏览器同源策略的限制,XmlHttpRequest只允许请求当前源(相同域名.协议.端口)的资源. -1)jsonp只支持get请求 -2)不受同源策略限制 ,兼容性好 不需要XMLHttpRequest(ActiveX)支持,通过js回调函数返回结果 -3)不能解决 不同域的两个页面之间js调用的问题 2. jsonp 原理 动态添加一个script标签,get链接上发送回调函数名称 传给服务器 服务器获取回调函数名称 返回这个函数名称的JS函数(拼装函

CNN中的卷积理解和实例

卷积操作是使用一个二维卷积核在在批处理的图片中进行扫描,具体的操作是在每一张图片上采用合适的窗口大小在图片的每一个通道上进行扫描. 权衡因素:在不同的通道和不同的卷积核之间进行权衡 在tensorflow中的函数为例: conv2d: 任意的卷积核,能同时在不同的通道上面进行卷积操作. 卷积核的卷积过程是按照 strides 参数来确定的,比如 strides = [1, 1, 1, 1] 表示卷积核对每个像素点进行卷积,即在二维屏幕上面,两个轴方向的步长都是1.strides = [1, 2,

Java多线程的理解和实例

编写具有多线程程序经常会用到的方法:run(), start(), wait(), notify(), notifyAll(), sleep(), yield(), join() 还有一个关键字:synchronized 下面主要来讲讲: 线程的创建方式就不需要细说,就2种方式 Thread和Runnable 1.run()和start() 实例1: public class ThreadTest extends Thread { public void run() { for (int i =