排序算法之冒泡排序

冒泡排序工作流程分析

一段废话

相信每个程序员在最开始接触编程的时候,知道的第一个排序算法就是冒泡排序了吧,我是大一在杭电上刷题的时候接触到的,我当时很愚笨(虽然现在也是,学了好久看了好多博客也搞不懂冒泡是怎么给数组排序的,我最后还是直接把关键代码背下来了去参加新生赛的(真的是太蠢了我害。好叭,我确实只是想吐槽一下我自己的脑子,完全有感而发,不过你既然都看到这了,我就给你推荐一本书吧——《我的第一本算法书》。很遗憾我大三了才看到这本书,推荐这本书的理由呢如下:

  1. 页数少,很快就能看完,重点在前几章,后面讲到一些安全加密相关的算法其实不看也可以。
  2. 第一章会讲到部分数据结构,图在后面的章节,都是用图来一步步演示的,很容易看懂。
  3. 第二章讲了部分排序算法,也是用图一步步演示排序过程的,而且根据排序步骤分析了时间复杂度。
  4. 整本书没有一行代码,自己去实现一遍比什么都好了,虽然我觉得能有伪代码就更好了害。

我以前也看过一些数据结构或者是讲算法的书,讲实话我一本都没坚持读下去,比如《大话数据结构》、《数据结构与算法分析》等等,我倒不是辣菜它们,是我太愚笨了,很多地方我都没办法理解,你们也可以读一下这些书,入门的话《我的第一本算法书》是很好的我觉得。
好叭我们进入正题。

正题

光看冒泡这个词的话,如果是初学者可能啥也看不出,但是熟悉了这个算法之后,这个词能帮助我们很好的记忆这个算法是怎样工作的,好比小鱼吐泡泡,泡泡一点一点往上升。
用文字说明的话,其实就是:

  1. 用当前数字跟它后面所有的数字进行比较,如果后面的数字比它小就进行交换。
  2. 重复1步骤直至到数组最后一个数字。

关键信息:每次交换之后,当前数字就是目前找到的最小数字了。

文字版可能没那么清楚,我们再看看图解版。
我们先看这一串乱序数列。
乱序数列
我们现在要对这一串数字进行冒泡排序。那我们要做的第一步就是设置当前数字对不对,不用问肯定是从第一个开始。
在这里插入图片描述
第二步,我们就要对后面的数字进行比较了,先比较第二个,发现1比当前数字9小,于是我们将这两个数字进行位置交换,注意交换过后当前数字还是指向的第一个数字,但是此时第一个数字是1了。
在这里插入图片描述
第三步,我们将当前数字和第三个数字进行比较,发现1比4小于是不进行交换,以此类推,第一次循环结束后,我们的排序结果是这样的:
在这里插入图片描述
第四步,我们开始第二轮循环,我们要将当前数字的指针换成第二个数字了对不对,就是下面这样,然后开始和后面的数字进行比较。
在这里插入图片描述
第五步,我们比较当前数字和第三个数字,发现4比9小,于是我们将4和9进行交换。
在这里插入图片描述
第六步,我们比较4和2,发现2比4小,于是进行交换。
在这里插入图片描述
第七步,我们比较2和7发现7比2大不用交换,后面的3和5同理。于是我们第二轮循环结束,开始第三轮循环。
在这里插入图片描述
第八步,我们比较9和4,发现4比9小,于是进行交换。
在这里插入图片描述
第九步,比较4和7,发现7比4大不用交换,接着比较3和4,发现3比4小要交换。
在这里插入图片描述
第十步,比较3和5,5比3大不用交换,于是结束第三轮循环,开始第四轮循环。
在这里插入图片描述
接下来的几轮循环我就懒得写了,你们自己去在草稿本上演算一下吧,我们直接进入代码阶段。

java版冒泡排序

根据上面说的工作步骤,其实我们是很容易写出来代码的,无非两个for循环,其他语言也一样啦,反正都是换汤不换药,哪怕语言语法不一样,对一个优秀的程序员来说也应该是能看懂的!

public class BubbleSort {

    public static int[] sort(int[] nums) {
        int len = nums.length;
        int temp;
        for (int i = 0; i < len - 1; i++) {
            for (int j = i; j < len; j++) {
            	// 发现后面有数字num[j]小于当前数字num[i]就进行交换
                if (nums[i] > nums[j]) {
                    temp = nums[i];
                    nums[i] = nums[j];
                    nums[j] = temp;
                }
            }
        }
        return nums;
    }

    public static void main(String[] args) {
        System.out.println(Arrays.toString(sort(new int[]{2, 5, 1, 7, 3, 0, 9})));
    }

}

时间复杂度分析

根据流程分析和代码,我们能看出,一个长度为n的数组进行冒泡排序的情况下,第一次循环比较了 n-1 次,第二次循环比较了 n-2 次,第三次循环比较了 n-3 次…一直到最后一次循环,只循环了1次,所以加起来是 1 + 2 + 3 + … + (n-3) + (n-2) + (n-1) = n * (n-1) / 2,所以时间复杂度就是O(n^2)啦。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值