前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【排序算法】-冒泡排序

【排序算法】-冒泡排序

作者头像
胖虎
发布2019-06-26 17:07:14
5740
发布2019-06-26 17:07:14
举报
文章被收录于专栏:晏霖

前言

冒泡排序是所有排序算法里最为简单的一种,也是面试经常让你手写的一种算法。说实话在此之前我也写不出来冒泡,所以在算法这块我也是下过功夫的,今天我就来通俗讲解冒泡排序的原理,让大家对冒泡有更深对印象,核心代码五行左右,so easy!

正文

首先冒泡对意思是什么呢,鱼在水里吐泡泡的时候,由于压强原因,越上升泡泡越大,所以冒泡排序默认是从小到大排序的算法。

核心思想

将一个数组的前一个数和后一个数做对比,如果前一个数大于后一个数,那么就把这两个数互换位置。

小技巧:

  • 每次完成一个大循环(最外层循环)就能找到此次循环中最大的数,放在后面。
  • 每经过一个最外层循环后,内层循环的次数会减少1

未经优化的冒泡排序

代码语言:javascript
复制
  private void test2() {        
  int[] arr = {12, 23, 34, 56, 6, 6, 78};        
  for (int i = 0; i < arr.length - 1; i++) { 
         for (int j = 0; j < arr.length - i - 1; j++) {                
         if (arr[j] > arr[j + 1]) {                    
         int temp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = temp;
               }
           }
       }
       System.out.println(Arrays.toString(arr));
   }

下面根假定一个数组 int[] arr = {2, 6, 9, 1}; 来讲解冒泡排序实现的过程

第一次对比:前一个数(值2),后一个数(值6),如果前一个大于后一个则互换,第一次对比完成后数组如下:

第二次对比:,将第二个(值6)和第三个(值9)做对比,第二次对比完成后数组如下:

第三次对比:将第三个(值9)和第四个(值1)做对比,第三次对比完成后数组如下:

第四次对比:将第一个(值2)和第二个(值6)做对比,第四次对比完成后数组如下:

第五次对比:将第二个(值6)和第三个(值1)做对比,第五次对比完成后数组如下:

第六次对比:将第一个(值2)和第二个(值1)做对比,第六次对比完成后数组如下:

上述我说的次数是内层循环的对比次数,也是内层的循环次数,可见有很多循环是没必要的,因为数组并没有更改,所以说直接这样使用冒泡排序是不理想的。我用了4个长度的数组就要循环这么多次,如果长度是几万的那简直是灾难,冒泡排序适用于数组长度在1万以内的。所以我们要对上面对代码进行优化。

优化后的冒泡排序

代码语言:javascript
复制
private void test2() {        
int[] arr = {12, 23, 34, 56, 6, 6, 78};        
 for (int i = 0; i < arr.length - 1; i++) {            
    boolean isSwap = false;            
      for (int j = 0; j < arr.length - i - 1; j++) {                
         if (arr[j] > arr[j + 1]) {                    
                    int temp = arr[j];
                   arr[j] = arr[j + 1];
                   arr[j + 1] = temp;
                   isSwap = true;
               }
           }            //如果当前循环没有发生交换跳出这次
           if (!isSwap) {
               System.out.println(Arrays.toString(arr));                
                return;
           }
       }
       System.out.println(Arrays.toString(arr)+"11111111");
   }

优化后的冒泡排序只是用在数组可能是顺序的情况下,或者数组前面的元素基本都是顺序的并且后面元素尽量都大于前面的元素,此情况下,效率可能更明显,此时使用冒泡排序最优情况的时间复杂度是:O(n)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-02-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 晏霖 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 正文
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档