冒泡算法及其优化

i从0开始,array[i]与array[i+1]比较,如果array[i]>array[i+1],那么就交换位置

经过一次排序后会将最大的值冒泡到最后一位 

  public void bubbleSort(int array[]) {
    for (int i = 0; i < array.length; i++) {
      // 由于array[j]与array[j+1]相比较,遍历到最后时应该位j+1=array.length,所以j<array.length-1
      for (int j = 0; j < array.length - 1; j++) {
        if (array[j] > array[j + 1]) {
          int temp = array[j];
          array[j] = array[j + 1];
          array[j + 1] = temp;
        }
      }
    }
  }

优化1

先看每一次遍历的最后一位

第一次遍历后,最大值被冒泡到第 i 位

第二次遍历后,第二大的值被冒泡到第 i-1 位

第三次遍历后,第三大的值被冒泡到第 i-2 位

...

因此每一次遍历后的最后一位不必再次比较

  public void bubbleSort(int array[]) {
    for (int i = 0; i < array.length; i++) {
      // 每一次遍历后最后一位都是最大的,无需重新比较,所以遍历到 array.length-1位就可以了
      for (int j = 0; j < array.length - i - 1; j++) {
        if (array[j] > array[j + 1]) {
          int temp = array[j];
          array[j] = array[j + 1];
          array[j + 1] = temp;
        }
      }
    }
  }

优化2

假如在某一次遍历完成后,数组已经完成了排序,那么就不用继续遍历

public void bubbleSort(int array[]) {
    for (int i = 0; i < array.length; i++) {
      boolean isSorted = true;//标志是否已排序
      for (int j = 0; j < array.length - i - 1; j++) {
        if (array[j] > array[j + 1]) {
          int temp = array[j];
          array[j] = array[j + 1];
          array[j + 1] = temp;
          isSorted = false;
        }
      }
      if (isSorted) {
        break;
      }
    }
  }

优化3

在某一次遍历后,最后很大一部分已经是有序的,此时可以无需对这部分在做排序,如 [3, 2, 1, 6, 7, 8, 9, 10],从array[3]之后就是有序的,我们可以在每一轮排序的最后,记录下最后一次元素交换的位置,即无序数组的边界位置

public void bubbleSort(int array[]) {
    int sortBorder = array.length - 1;//无需数组的边界
    int lastExchageIndex = 0;//记录最后交换的位置
    for (int i = 0; i < array.length; i++) {
      boolean isSorted = true;
      for (int j = 0; j < sortBorder; j++) {
        if (array[j] > array[j + 1]) {
          int temp = array[j];
          array[j] = array[j + 1];
          array[j + 1] = temp;
          isSorted = false;
          lastExchageIndex = j;
        }
      }
      sortBorder = lastExchageIndex;
      if (isSorted) {
        break;
      }
    }
  }

参考https://blog.csdn.net/wubingju93123/article/details/81215984

猜你喜欢

转载自www.cnblogs.com/lz-0011/p/12078528.html
今日推荐