看图说话排序算法之冒泡排序

排序算法的种类非常多,这里总结冒泡排序和对冒泡排序的改进---快速排序的循环实现和递归实现。

一丶冒泡排序

    假设待排序的数组A为{7,6,4,8,9,1,2}。冒泡排序的算法原理和何其名字十分的贴切,第一次将最大的数字交换到数组的末尾,第二次将第二大的数交换到数组的末尾的前一个,这样循环交换N-1次后,原数组中的每一个元素都找到了合适的位置,排序完成。

图1 待排序数组

    依据算法的思路,第一次应该将最大的数字9交换到数组的末尾。下面按照图例的形式介绍如何将最大的数字9交换到数组的末尾。

  1. 取数组的第一个元素(7),依次和后面的元素进行比较,如果大于后面的元素,则进行交换。


    image
  2. 指针i+1,和后面的元素比较。如果大于后面的元素,则进行交换。


    image
  3. 指针i+1继续,重复上述的比较过程。发现7小于8,所以不交换元素位置。


    image
  4. 指针i+1继续,重复上述比较过程。发现8小于9,同样不交换元素的位置。


    image
  5. 指针继续i+1,重复上述比较过程,发现9大于1,交换元素位置。


    image
  6. 指针继续i+1,重复上述比较过程,发现9大于2,交换元素位置。


    image

        通过上述的六个步骤,可以清晰的看见待排序数组中的最大元素交换到数组的末尾的过程。这六个过程就是一次冒泡交换的过程。通过上述的六个过程,我们不仅需要知道最大的元素冒泡原理,对待排序数组A,还需要提炼出如下的规律:

  • 待排序数组的长度为N,则需要进行N-1次冒泡交换,才能完成对数组的排序操作。

  • 第1次冒泡交换,指在[0,N-1]的下标范围内,将最大元素冒泡交换至A[N-1]处。其中最大交换次数为N-1次。

  • 第i次冒泡交换,指在[0,N-i]的下标范围内,将最大元素冒泡交换至A[N-i]处。其中最大交换次数为N-i次。(1<=i<=N-1)

  • 总共的交换次数为(1+N-1)(N-1)/2,冒泡排序的时间复杂度为O(n2)。

  • 完整的冒泡排序,就是对待排序数组A,进行N-1的冒泡交换。得到排序后的数组。

代码:
public classbubbleSort {
   publicstatic void main(String[] args){
      int[] array = new int[]{7,6,4,8,9,1,2};
      Sort(array);
      for(int i =0;i<array.length;i++){
        System.out.print(array[i]+" ");
      }
   }
   publicstatic void Sort(int []array){
      for(int i = 0;i<array.length;i++){
        for(int j = 0;j<array.length-i-1;j++){
           if(array[j]>array[j+1]){
              int temp =array[j+1];
              array[j+1] = array[j];
              array[j] = temp;
           }
        }
      }
   }
}

二丶冒泡排序改进思路

    上述的原理是冒泡排序算法的基本原理和实现,在某些情况下上述的算法是可以进行某种程度的优化的,比如基本有序的数组{9,1,2,3,4,5,6,7}。对于该数组而言,如果采用原始冒泡排序的话,该语句(array[j]>array[j+1])依然会进行O(n2)的比较。但是我们发现,经过第一次冒泡交换以后,数组就已经有序了,后面的比较都是没有意义的。在这种情况下,可以对冒泡排序进行优化,也就是在基本有序的情况下对冒泡排序进行优化。

  • 设置一个标志位flag,在每次冒泡交换之前置flag=false;如果该次冒泡交换没有进行元素交换,则代表数组已经是有序的了,flag=true。结束排序。
public classbubbleSort {
   publicstatic void main(String[] args){
      int[] array = new int[]{7,6,4,8,9,1,2};
      Sort(array);
      for(int i =0;i<array.length;i++){
        System.out.print(array[i]+" ");
      }
   }
   publicstatic void Sort(int []array){
      boolena flag =false;
      for(int i = 0;i<array.length;i++){
        flag =false;
        for(int j = 0;j<array.length-i-1;j++){
           if(array[j]>array[j+1]){
              false =true;
              int temp =array[j+1];
              array[j+1] = array[j];
              array[j] = temp;
           }
        }
        if(!flag){
           break;
         }
      }
   }
}

Reference:
[1] 数据结构与算法 java语言描述版
[2] 原文博客链接

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • 搞懂基本排序算法 上篇文章写了关于 Java 内部类的基本知识,感兴趣的朋友可以去看一下:搞懂 JAVA 内部类;...
    醒着的码者阅读 1,176评论 3 4
  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 1,334评论 0 1
  • 使用价值 程序员是一种逻辑动物,只有当理解求职到底是一种什么行为以后,才能做出有意义的行动。 绝大部分公司购买人才...
    CoderCurtis阅读 418评论 0 0
  • 【R:阅读原文】片段选自《在脑袋一侧猛敲一下》 如果一个人只需要表明一种想法,他通常会提出“有把握的想法”,而不会...
    平凡人也能飞翔阅读 214评论 1 0
  • 今天是传说中的鬼节,外面下了场大暴雨,不打算出门了,虽人没去健身房,心已经到了那里。 养成健身的习惯后,你不去...
    Jenny日记阅读 249评论 1 2