【面试准备】冒泡排序

基本思想

两个数比较大小,大数上浮,小数下沉!因为跟水开了的时候那个状态相似,所以简称冒泡!
简单来说就是这样:比如有两个数a和b,如果a>b,就将a和b的位置互换。

最直接写法

public static void bubbleSort(int[] arr) {
  int temp;
  for (int i = 0; i < arr.length - 1; i++) {
    for (int j = arr.length - 1; j > i; j--) {
      if (arr[j] < arr[j - 1]) {
        temp = arr[j];
        arr[j] = arr[j - 1];
        arr[j - 1] = temp;
      }
    }
  }
}

上面的写法也是最简单最直接的,两层for循环就可以将数组排好序。但是对于一些极端情况并没有考虑进去,比如有这样一个数组 int[] array = {1, 2, 3, 4, 5, 6, 8, 7}; ,第一趟就可以将数组排好序,那么后续的步骤就完全不用再执行了,为了节省算法的执行时间,可以使用一个状态位来标记数组是否已经排好序,只要可以判断出数组已经排好序了,那么后续的遍历就完全不用了。所以就有了下面的优化写法。

优化写法

public static void bubbleSort(int[] arr) {
  int temp;
  boolean flag;
  for (int i = 0; i < arr.length - 1; i++) { 
    flag = false;
    for (int j = arr.length - 1; j > i; j--) {
      if (arr[j] < arr[j - 1]) {
        temp = arr[j];
        arr[j] = arr[j - 1];
        arr[j - 1] = temp;
        flag = true;
      }
    }
    if (!flag) {
      break;
    }
  }
}

这种优化写法的意图简单概括一下:
在一趟排序中,只要数组中有元素发生了交换,就判定数组还没有排好序,也就是说只要有一趟排序的过程中没有发生元素的交换,那么就说明这个数组已经是排好序了,后续的排序步骤完全可以不用执行,大大节省时间。

假如初始数组就是int[] array = {1, 2, 3, 4, 5, 6, 8, 7};,通过断点调试的方式可以发现,第一趟排序的结果是1, 2, 3, 4, 5, 6, 7, 8

  • 如果使用普通写法,最外层的循环需要执行 8 次,也就是说还需要执行 7 趟;
  • 如果使用优化写法,最外层的循环只需要执行 2 次,第一趟执行完数组已经排好序了,第二趟执行的时候flag的值是false,进入下面的 if 条件判断,直接结束循环,后面6次就不会再去执行了,是不是节省了一些时间?

你可能感兴趣的:(【面试准备】冒泡排序)