冒泡排序是一种简单的排序算法。


步骤:

  1. 遍历比较相邻的两个元素,被比较的左边元素大于右边元素,则交换位置。第一轮遍历、比较、交换完,最后一个是最大的元素

  2. 若本次遍历中没有数据交换,代表排序结束,提前退出

  3. 有数据交换则再从第一个元素开始遍历、比较、交换,排除最后一个元素

  4. 重复 1、2、3 步骤,每次排除上次被遍历的最后一个元素,直到排序完成

 

代码:

package constxiong.interview;
/** * 冒泡排序 * @author ConstXiong */public class BubbleSort {
 public static void main(String[] args) {    int [] array = {33, 22, 1, 4, 25, 88, 71, 4};    bubbleSort(array);  }  /**   * 冒泡排序   * @param array   */  public static void bubbleSort(int[] array) {    print(array);    for (int i = 0; i < array.length; i++) {      //提前退出冒泡循环的标志      boolean hasSwitch = false;      //因为使用 j 和 j+1 的下标进行比较,所以 j 的最大值为数组长度 - 2      for (int j = 0; j < array.length - (i+1); j++) {        if (array[j] > array[j + 1]) {          int temp = array[j + 1];          array[j+1] = array[j];          array[j] = temp;          hasSwitch = true;//有数据交换          print(array);        }      }      //没有数据交换退出循环      if (!hasSwitch) {        break;      }    }  }  /**   * 打印数组   * @param array   */  private static void print(int[] array) {    for(int i : array) {      System.out.print(i + " ");    }    System.out.println();  } }

 

打印结果:

33 22 1 4 25 88 71 4 22 33 1 4 25 88 71 4 22 1 33 4 25 88 71 4 22 1 4 33 25 88 71 4 22 1 4 25 33 88 71 4 22 1 4 25 33 71 88 4 22 1 4 25 33 71 4 88 1 22 4 25 33 71 4 88 1 4 22 25 33 71 4 88 1 4 22 25 33 4 71 88 1 4 22 25 4 33 71 88 1 4 22 4 25 33 71 88 1 4 4 22 25 33 71 88

 

特征:

  • 每一轮遍历中的数,最大的会被移动到最右边

  • 最好情况时间复杂度:O(n) 。即数组本身有序,如 1,2,3,4,5

  • 最坏情况时间复杂度:O(n2) 。即数组本身完全逆序,如 5,4,3,2,1

  • 平均情况下的时间复杂度是 O(n2)。最好情况下进行 0 次交换,最坏情况下进行 n*(n-1)/2 次交换,平均就是 n*(n-1)/2 次交换,比较操作肯定多于交换操作,上限 O(n2),不严格地推断,平均情况下的时间复杂度就是 O(n2)

  • 空间复杂度 O(1)。除了数组内存,只额外申请了一个 temp 变量。是一个原地排序算法。

  • 是稳定的排序算法。即代码示例中,第一个 4 和第二个 4,一定未发生位置变换。




开刷算法面试题...


更多相关文章

  1. 同样的复杂度,为什么插入排序比冒泡排序更受欢迎?
  2. 数据结构--时间复杂度与空间复杂度
  3. jQuery遍历祖先元素:parentsUntil
  4. jQuery在点击按钮上迭代/循环遍历数据表
  5. jQuery遍历----------(遍历、祖先、后代、同胞、过滤)
  6. jQuery遍历Table tr td td中包含标签
  7. 是否有更快的方法来遍历HTMLDocument中的每一个元素呢?
  8. php逐个汉字遍历字符串
  9. Javascript学习:案例7--对象属性和方法的遍历、删除、添加.html

随机推荐

  1. 用 Vue 开发自己的 Chrome 扩展[每日前端
  2. 我还在生产玩 JDK7,JDK 15 却要来了!|新特
  3. 这才是GraphQL最详细的解释[每日前端夜话
  4. linux 破解root密码时遇到的问题
  5. SpringBoot热部署加持
  6. WebRTC 的现状和未来:专访 W3C WebRTC Cha
  7. Spring Boot Admin 2.0开箱体验
  8. 从一份配置清单详解Nginx服务器配置
  9. 没想到,这么简单的线程池用法,深藏这么多坑
  10. 用TS+GraphQL查询SpaceX火箭发射数据[每