你说你学过数据结构和算法,但不知道冒泡排序?

在我们的程序中,排序是非常常见的一种需求。需求背景是针对已知的一些数据元素,把这些数据元素按照一定的规则进行排序。比如查询一些商品,要求按照商品的最后更新时间进行倒序排序。

今天我们学习冒泡排序,这可以说是排序算法里最简单的一种排序了。相信也是大家入门算法都绕不开的一段经历。话不多说,开撸。

1. 需求

假设有一个数组,排序前是:[4, 5, 6, 3, 2, 1]。现要求按照数字从小到大升序排序,即排序后的数组为:[1, 2, 3, 4, 5, 6]。

  • 排序前:{4, 5, 6, 3, 2, 1}
  • 排序后:{1, 2, 3, 4, 5, 6}

2. 冒泡排序原理

冒泡排序的主要原理:

  1. 比较相邻的元素。如果前一个元素比后一个元素大,就交换这两个元素的位置。
  2. 对每一对相邻元素做同样的工作,从开始第一对元素到结尾的最后一对元素。最终最后位置的元素就是最大值。

动图展示图下:

在这里插入图片描述
排序整体过程大致如下:
在这里插入图片描述

3. API设计

类名Bubble
构造方法Bubble():创建Bubble对象。
成员方法1. public static void sort(Comparable[] a):对数组内的元素进行排序。
2. private static boolean greater(Comparable v, Comparable w):判断v是否大于w。
3. private static void exchange(Comparable[] a, int i, int j):交换 a 数组中索引 i 和索引 j 处的值。

4. 代码实现

public class Bubble {

  public static void sort(Comparable[] a) {
    for (int i = a.length - 1; i > 0; i--) {
      for (int j = 0; j < i; j++) {
        if (greater(a[j], a[j + 1])) {
          exchange(a, j, j + 1);
        }
      }
    }
  }

  private static boolean greater(Comparable v, Comparable w) {
    return v.compareTo(w) > 0;
  }

  private static void exchange(Comparable[] a, int i, int j) {
    Comparable temp = a[i];
    a[i] = a[j];
    a[j] = temp;
  }

  public static void main(String[] args) {
    Integer[] a = {4, 5, 6, 3, 2, 1};
    sort(a);
    System.out.println(Arrays.toString(a));
  }
}

5. 时间复杂度分析

冒泡排序使用了双层for循环,其中内层循环的循环体是真正完成排序的代码,所以我们分析冒泡排序的时间复杂度,主要分析一下内层循环体的执行次数即可。

在最坏情况下,也就是假如要排序的元素为{6, 5, 4, 3, 2, 1}逆序,那么:

  • 元素比较的次数为:(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2
  • 元素交换的次数为:(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2

总执行次数为:(N^2/2-N/2)+(N^2/2-N/2)=N^2-N

按照大O推导法则,保留函数中的最高阶项那么最终冒泡排序的时间复杂度为O(N^2)。

源代码:https://gitee.com/anbang713/day-day-up/blob/master/algorithm/src/main/java/com/study/algorithm/sort/Bubble.java

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值