Java小白入门200例53之冒泡排序

Posted 编程界明世隐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java小白入门200例53之冒泡排序相关的知识,希望对你有一定的参考价值。

作者简介

作者名:编程界明世隐
简介:CSDN博客专家,从事软件开发多年,精通Java、javascript,博主也是从零开始一步步把学习成长、深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢迎您关注,期待与您一起学习、成长、起飞!

引言

很多Java初学者问我,新手明明很用心、很努力学习的Java知识,转头又忘记了,很让人犯愁,小白如何能够快速成长、成为大牛呢?
其实要成为大神的技巧只有一个:“多学多练”,于是明哥就整理了比较典型的练习实例,通过练习能够快速提升编码技巧和熟练度,让你在成为大佬的路上一去不复返(切记要亲手练习哦)!

导航

✪ Java小白入门200例系列目录索引
◄上一篇  52.实现淡旺季飞机票打折
►下一篇  54.打印水仙花数

什么是冒泡排序

依次比较两个相邻的子元素,如果他们的顺序错误就把他们交换过来,重复地进行此过程直到没有相邻元素需要交换,即完成整个冒泡。

现在设定一个数组,元素为 2,4,3,1 我们需要通过冒泡最终排序成1,2,3,4 用图来说明一下:

首先我们就对第一个元素2和第2个元素4进行比较,如果第一个元素大于第2个元素则交换位置,否则不交换

实现冒泡排序

第一次冒泡

int[] arr = new int[] { 2, 4, 3, 1 };
      
if(arr[0]>arr[1]){//第一个元素大于第2个元素则执行交换,否则不做操作
    int temp = arr[1];
    arr[1] = arr[0];
    arr[0] = temp;
 }

执行后发现不需要交换,于是得到顺序如下

再来处理第2个元素和第3个元素:

于是我们代码编写如下:

 int[] arr = new int[] { 2, 4, 3, 1 };
      
 if(arr[0]>arr[1]){
    int temp = arr[1];
    arr[1] = arr[0];
    arr[0] = temp;
 }
 
 if(arr[1]>arr[2]){
    int temp = arr[2];
    arr[2] = arr[1];
    arr[1] = temp;
 }

执行后发现,4大于3 需要交换位置,交换完后顺序如下:

再来比较最后两个元素,也就是现在的4和1

于是我编写代码如下:

int[] arr = new int[] { 2, 4, 3, 1 };
      
if(arr[0]>arr[1]){
    int temp = arr[1];
    arr[1] = arr[0];
    arr[0] = temp;
 }
 
 if(arr[1]>arr[2]){
    int temp = arr[2];
    arr[2] = arr[1];
    arr[1] = temp;
 }
 if(arr[2]>arr[3]){
    int temp = arr[3];
    arr[3] = arr[2];
    arr[2] = temp;
 }

发现次数4大于1需要换行位置,结果如下

至此我们完成了第一次冒泡,最大的元素4冒泡到最后,现在来优化一下这段代码

细看这段代码,我们很容易发现规律,这里面的0,1,2,3不就是元素对应的下标吗?执行的次数刚好是数组的长度减1,那我们用循环不就可以了,修改以后:

int[] arr = new int[] { 2, 4, 3, 1 };
     
for(int j = 0; j < arr.length-1; j++){
    if(arr[j]>arr[j+1]){
       int temp = arr[j + 1];
       arr[j + 1] = arr[j];
       arr[j] = temp;
    }
 }

第二次冒泡

因为4已经移动到最后了,此时需要排序的就剩下前面3个元素了

那这个代码就很好写了,无非就是比上一次循环少一个元素

在上次循环的基础上,循环的判断条件减去1,就可以达到这个效果

int[] arr = new int[] { 2, 4, 3, 1 };
     
for(int j = 0; j < arr.length-1; j++){
   if(arr[j]>arr[j+1]){
      int temp = arr[j + 1];
      arr[j + 1] = arr[j];
      arr[j] = temp;
   }
}


for(int j = 0; j < arr.length-1-1; j++){
   if(arr[j]>arr[j+1]){
      int temp = arr[j + 1];
      arr[j + 1] = arr[j];
      arr[j] = temp;
   }
}

运行后此时的顺序是这样的 2 1 3 4

第三次冒泡

还需要比较前面两个元素,那我们加上代码

int[] arr = new int[] { 2, 4, 3, 1 };
     
for(int j = 0; j < arr.length-1; j++){
   if(arr[j]>arr[j+1]){
      int temp = arr[j + 1];
      arr[j + 1] = arr[j];
      arr[j] = temp;
   }
}

for(int j = 0; j < arr.length-1-1; j++){
   if(arr[j]>arr[j+1]){
      int temp = arr[j + 1];
      arr[j + 1] = arr[j];
      arr[j] = temp;
   }
}

for(int j = 0; j < arr.length-1-2; j++){
   if(arr[j]>arr[j+1]){
      int temp = arr[j + 1];
      arr[j + 1] = arr[j];
      arr[j] = temp;
   }
}

我们来运行一下,看看结果

结果就是1,2,3,4 至此效果已经实现了,但是代码还是需要改进的,来看看目前代码的规律

我们很容易发现其实除了图中框住的以外,都是相同的,是不是在这里做做文章呢,如果我再加一个东西是不是你就看出规律了

从0到1到2,是不是很像数组的下标,而且是依次递增的,让我们很容易的想到这里可以再次利用数组的循环,同时我们把图中的里面0,1,2换成对应的下标就好了。

for (int i = 0; i < arr.length-1; i++)
{
   for(int j = 0; j < arr.length-1-i; j++){
      if(arr[j]>arr[j+1]){
         int temp = arr[j + 1];
         arr[j + 1] = arr[j];
         arr[j] = temp;
      }
   } 
}

甚至还可以把 arr.length-1 这个判断添加再提出来

 int[] arr = new int[] { 2, 4, 3, 1 };
     
 int condition = arr.length-1;
 for (int i = 0; i < condition; i++)
 {
    for(int j = 0; j < condition-i; j++){
       if(arr[j]>arr[j+1]){
          int temp = arr[j + 1];
          arr[j + 1] = arr[j];
          arr[j] = temp;
       }
    } 
 }

修改数据再试一下

public static void main(String[] args)
{
    int[] arr = new int[] { 2000, 400, 30, 100,50,60 };
   
    int condition = arr.length-1;
    for (int i = 0; i < condition; i++)
    {
       for(int j = 0; j < condition-i; j++){
          if(arr[j]>arr[j+1]){
             int temp = arr[j + 1];
             arr[j + 1] = arr[j];
             arr[j] = temp;
          }
       } 
    }
    
    for (int i = 0; i < arr.length; i++)
    {
       System.out.print(arr[i] + " ");
    }
 }

运行结果

小结

这节总结了“冒泡排序”,希望能对大家有所帮助,请各位小伙伴帮忙 【点赞】+【收藏】+ 【评论区打卡】, 如果有兴趣跟小明哥一起学习Java的,【关注一波】不迷路哦。

评论区打卡一波让我知道你,明哥会持续关注你的学习进度哦!

导航

✪ Java小白入门200例系列目录索引
◄上一篇  52.实现淡旺季飞机票打折
►下一篇  54.打印水仙花数

热门专栏推荐

1.Java小游戏系列(俄罗斯方块、飞机大战、植物大战僵尸等)
2.JavaWeb项目实战(图书管理、在线考试、宿舍管理系统等)
3.JavaScript精彩实例(飞机大战、扫雷、贪吃蛇、验证码等)
4.Java小白入门200例
5.从零学Java、趣学Java、以王者荣耀角度学Java

以上是关于Java小白入门200例53之冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章

Java小白入门200例66之快速排序

Java小白入门200例65之Java sort()数组排序

Java小白入门200例111之Collections类操作集合详解

Java小白入门200例115之Java模拟斗地主发牌

Java小白入门200例98之Java异常

Java小白入门200例95之Java匿名类