Java学习11--冒泡排序

冒泡排序

常用的总共有八大排序算法(后面再说)

冒泡排序是最出名的算法之一,核心是,丛数组的头部或者尾部开始,相邻两个元素比大小,把相对大的往上冒。永远追随最大的那个元素。当相邻两元素相比,新元素比当前元素大,就交换两者的位置,直到将最大的元素交换数组的另一侧。这是第一趟,一共进行n-1趟这样的交换就可以把所有的元素按大小排序。(n-1趟是因为只剩两个元素时最多只需要交换一次。)

举例:已有一个随机顺序的数组,要求按大小输出其元素:先由大到小,再由小到大。

可能用到的命令:将数组转化成string便于输出
Arrays.toString(nums);

程序举例:

testjan05.java 复制代码
import java.util.Arrays;

public class testjan05 {
    public static void main(String[] args) {
        int [] nums={33,34,35,1,2,3,4,31,32,5,21,22,23,24,25,11,12,13,14,15};
        //int [] nums={11,2,13,4,5,26,17,8,9,10,6};
        System.out.print("由小到大排序"+Arrays.toString(bubble_r_max(nums))+"\t");
        System.out.println();
        System.out.print("有大到小排序"+Arrays.toString(bubble_l_max(nums))+"\t");

    }

    public static int[]bubble_l_max(int[] arr_in) {

        int r_larger=0;

        for (int i =0 ; i<= arr_in.length-2 ; i++) {
            for (int m =0 ; m<= arr_in.length-2-i ; m++){
                if (arr_in[m]<arr_in[m+1] ){
                    r_larger=arr_in[m];
                    arr_in[m]=arr_in[m+1];
                    arr_in[m+1]=r_larger;
                }
            }

        }
        return arr_in;

    }

    public static int[]bubble_r_max(int[] arr_in) {

        int r_larger=0;

        for (int i =0 ; i<= arr_in.length-2 ; i++) {
            for (int m =0 ; m<= arr_in.length-2-i ; m++){
                if (arr_in[m]>arr_in[m+1] ){
                    r_larger=arr_in[m];
                    arr_in[m]=arr_in[m+1];
                    arr_in[m+1]=r_larger;
                }
            }

        }
        return arr_in;

    }



}

运行结果

复制代码
由小到大排序[1, 2, 3, 4, 5, 11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 31, 32, 33, 34, 35]	
有大到小排序[35, 34, 33, 32, 31, 25, 24, 23, 22, 21, 15, 14, 13, 12, 11, 5, 4, 3, 2, 1]	
Process finished with exit code 0
  • 优化思路
    如果这组数组中在排序比较过程中,发现剩下的数组部分其实已经是按照想要的大小顺序排列的了,那么就可以直接结束工作,不需要再继续冒泡排序了。
    如何将这类特殊情况写在代码中,减少多余的两两比较呢?

提示:用boolean flag

  • 具体操作:

    在一层for循环内部,设置一个boolean flag =false;

    在两层for循环内部,添加一个bolean flag==true;//只要执行了这层排序那么flag就会为变真

    再在第一层循环外部 添加一个if (flag==false){break;}//如果flag为false,说明本层循环排序不用执行了,默认排序就是符合要求的,所以直接跳出。

代码详解:

java 复制代码
import java.util.Arrays;
public class testjan05{
    public static void main(String[] args) {
        int [] nums={3,34,35,1,2,3,4,31,32,5,21,22,23,24,25,11,12,13,14,15};
        System.out.println(Arrays.toString(r_max(nums)));
    }

    public static int[] r_max(int[] nums_in) {
        int num_bigger=nums_in[0];
        boolean flag_more_work =false;
        for (int i = 0; i < nums_in.length-1; i++) {
            flag_more_work = false;
            for (int j = 0; j < nums_in.length-1-i; j++) {

                if(nums_in[j]>nums_in[j+1]){
                    flag_more_work=true;
                    num_bigger=nums_in[j];
                    nums_in[j]=nums_in[j+1];
                    nums_in[j+1]=num_bigger;
                }
                if(flag_more_work=false)
                    break;
                //当flag_more_work在此处仍为false时,
                //说明此轮(nums_in[j]>nums_in[j+1])条件从未被满足过
                //说明剩下的数组就是按照从小到大的顺序排列的了,可以结束战斗了
                //
            }
        }
        return nums_in;
    }
}
相关推荐
高级程序源2 小时前
django校园寻物通失物招领平台32261-计算机课程设计、毕业设计
vue.js·python·mysql·小程序·django·flask·课程设计
WeiXin_DZbishe2 小时前
基于springboot宠物领养系统-计算机毕设 附源码【课程设计】94217
vue.js·spring boot·python·django·php·课程设计
kimnoic3 小时前
Python数据库学习心得:SQLite、MySQL、PostgreSQL优缺点
开发语言·python
snhna3 小时前
向量数据库深度实战:从 HNSW 到 pgvector、Milvus 选型与 RAG 落地
数据库·人工智能·python·postgresql·milvus
别动我齐刘海3 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
必须得开心呀4 小时前
python编写带界面的软件,需要安装哪些插件
开发语言·python
Wx-bishekaifayuan4 小时前
express皖美特色农产品网售系统53118-计算机课程设计、毕业设计
人工智能·spring boot·后端·python·课程设计·express·旅游
青少儿编程课堂4 小时前
迪杰斯特拉(Dijkstra)算法:单源最短路与赛场路线规划
c++·python·算法·bfs·信息学竞赛
计算机编程指导师4 小时前
【计算机毕设推荐】基于Hadoop+Spark的公共交通运营数据分析与可视化系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·hadoop·python·计算机·数据分析·spark·交通
Wx-bishekaifayuan4 小时前
springboot汉中旅游服务平台41442-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游