冒泡排序算法

147 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

本文系作者 不太自律的程序猿原创,转载请私信并在文章开头附带作者和原文地址链接。

冒泡排序算法

冒泡排序(Bubble Sort)是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。

冒泡排序思想

1.比较相邻的两个元素,如果第一个元素大于第二个元素,就交换位置

2.对每一对相邻的元素再做同样的比较,从最开始的一对到结尾的一对完成全部的比较。最后一个元素肯定最大的

3.对剩下的元素重复第二步操作,直到只有一个元素为止

模拟冒泡排序

d63f13cf05d849779527e5e8fa70eaa6.gif

//模拟冒泡排序

        int[] arr = {8,1,2,7,6,5,4,3};
        //每相邻的元素进行比较大小
        //遍历数组
        
        // 第1趟  1,2,7,6,5,4,3,[8]     7次
        // 第2趟  1,2,6,5,4,3,[7]       6次
        // 第3趟  1,2,5,4,3,[6]         5次
        // 第4趟  1,2,4,3,[5]           4次
        // 第5趟  1,2,3,[4]             3次
        // 第6趟  1,2,[3]               2次
        // 第7趟  1,[2]                 1次
         
        //分析:
        //   共比较趟数  arr.length-1
        //   每一趟中比较的次数: 趟数+次数 = 8(arr.length)
        //   两个变量互换值
        //System.out.println(Arrays.toString(arr));
        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 t = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = t;
                }
            }
            System.out.println(Arrays.toString(arr));
        }

现状:

1、我们会发现在第五轮冒泡后就没有发生过交换行为,后续的第六轮和第七轮都是无效循环,浪费资源。

解决方案: 若数组本身有序,则不需要进行每次循环判断,增加一个标志位标识每次是否进行交换即可。

冒泡排序的优化

for (int i = 0; i < arr.length - 1; i++) {//控制趟数
            //定义boolean类型变量,用来标识每趟是否存在交换值
            boolean flag = false;
            for (int j = 0; j < arr.length - 1 - i; j++) {//控制次数
                //比较相邻元素的值
                if(arr[j] > arr[j+1]){
                    int t = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = t;
                    flag = true;//说明这趟存在交换值情况
                }
            }
            System.out.println(Arrays.toString(arr));
            if(!flag){ 
                break;//若flag为false,表示此趟不存在交换值的情况,提前结束循环
            }
        }

感谢诸君的观看,文中如有纰漏,欢迎在评论区来交流。如果这篇文章帮助到了你,欢迎点赞👍关注。