美文网首页初见
【面试准备】冒泡排序

【面试准备】冒泡排序

作者: bearPotMan | 来源:发表于2019-12-09 20:38 被阅读0次

    基本思想

    两个数比较大小,大数上浮,小数下沉!因为跟水开了的时候那个状态相似,所以简称冒泡!
    简单来说就是这样:比如有两个数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次就不会再去执行了,是不是节省了一些时间?

    相关文章

      网友评论

        本文标题:【面试准备】冒泡排序

        本文链接:https://www.haomeiwen.com/subject/wdrigctx.html