《数据结构与算法分析》之冒泡排序

谈跟风

工作中有压力很正常,应对压力的办法也有很多。

有的人选择积极应对,有的人选择良木而栖,都很正常。

以前不理解富士康的13连跳,心想,不就是一分工作,大不了不干了啊,为啥跳楼。。。。现在随着工作年限增多,有的时候竟有些许"感同身受"。

那个时候"打工人"还没火起来,广大打工人还没有觉醒。也不像现在一致痛骂"资本家"。

有同事呆不不开心,要离开了,听说跳槽新东家薪资double,心里不安分的念头开始萌芽。

跳槽没问题,跟风跳槽有问题,还是要想想自己想要的是什么,不要冲动性换工作。钱多,事少,离家近,好比鱼和熊掌,难以兼得。

冒泡排序

传送门

插入排序:《数据结构与算法分析》之插入排序

什么是冒泡排序

冒泡排序算是很常用的一种排序算法,还记得刚毕业的时候面试偶尔会碰到,做笔试题。后来多干了几年,好像面试也不问了。

不过还是值得回顾一下:

从未排序的第一个元素开始,依次与相邻元素比较,大的往后浮,小的向前沉,直到元素排序完成;并且比较趟数不一定。

还是以一个整型数组来分析一下

原始数组34864513221
第一趟之后83451322164
第二趟之后83432215164
第三趟之后83221345164
第四趟之后82132345164
第五趟,已经排序完成      

 

上面一个数组:[34,8,64,51,32,21],有6个元素。

  • 第一趟排序:34>8进行交换,34<64不交换,64依次与51,32比较最大,得到第一趟之后结果。第一趟之后,最大元素64已经冒泡到最后一个元素。并且64不再参与后续排序
  • 第二趟排序:8<34不改变,34<51不改变,51依次与32,21比较最大,得到第二趟之后结果。第二趟之后,最大元素51已经冒泡到最后一个元素。并且51不再参与后续排序
  • 第三趟排序:8<34不改变,34>32,21比较最大,依次交换,得到第三趟之后结果。第三趟之后,最大元素34已经冒泡到最后一个元素。并且34不再参与后续排序
  • 第四趟排序:8<32不改变,32>21交换,此时整个数组已经有序了。第四趟之后,最大元素32已经冒泡到最后一个元素。并且32不再参与后续排序

经过上面4趟排序,整个数组已经排序完成。每经过一次排序,则会排出一个最大元素。那么理论上应该要经过6趟才能完全排序完成,那么如何确定排序已经完成,程序结束呢?

可以设置一个标志位,如果排序过程中有元素交换,表示排序未完成,如果无元素交换,表示排序完成,就可以不用进行后续无用的比较提高效率!

java实现

用java代码实现一下上面说到的冒泡排序

public class BubbleSortTest {

    /**
     * 冒泡排序
     *
     * @param a
     */
    public void bubbleSort(int a[]) {
        // 中间变量,用于元素交换
        int temp;
        // 外层循环,次数为数组的长度
        for (int i = 0; i < a.length; i++) {
            // 排序循环是否结束的标志
            boolean flag = true;
            print(a, i);
            // 内层循环,比较次数逐渐减少
            for (int j = 0; j < a.length - i - 1; j++) {
                // 如果当前元素比邻近元素更大,则进行交换,这个就是冒泡的核心代码
                if (a[j] > a[j + 1]) {
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                    // 设置结束标志为false,表示有元素交换,不能结束
                    flag = false;
                }
            }
            if (flag) {
                break;
            }
        }
    }

    @Test
    public void test() {
        int sortArray[] = {34, 8, 64, 51, 32, 21};
        bubbleSort(sortArray);
    }

    public void print(int sortArray[], int num) {
        System.out.print("冒泡排序比较的趟数:" + num + "  ,排序之后的数组:");
        for (int i = 0, j = sortArray.length; i < j; i++) {
            System.out.print("," + sortArray[i]);
        }
        System.out.println();
    }
}

打印输出

上面代码也是分为2层循环,外层循环次数为数组的长度。内层循环次数为数组长度-当前外层循环-1:

内层循环的次数为什么是这么多呢?因为外层每循环完成一次,内层元素不用跟自身比较所以-1,而且已经排序的元素不用参与排序,每趟就是i个元素,所以-i。

比如

  • 第一趟比较,i=0,那么内层循环是j=6-0-1=5次,因为不用跟自身比较
  • i=1,内层循环j=6-1-1=4,因为不用跟自身+已经排序的64比较
  • i=2,内层循环j=6-2-1=3,因为不用跟自身+已经排序的64,51比较

依次类推

算法总结

  • 时间复杂度为O(n^{2})
  • 排序趟数与原始序列中数据的排列有关
  • 是一种稳定性的排序

冒泡排序适用于原始序列比较有序的情况,效率较高

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值