冒泡排序

173 阅读2分钟

基本思路

示例要排序的数组为array,每个元素为item

  1. 第一次遍历,初始元素为第一个元素,比较与item相邻的元素是否小于item,如果小于,则交换两列,此时数> > 组最后一个元素一定是最大的元素。

  2. 以此类推,每次遍历都会将较大的数放到后面 该算法的实现中复杂度最坏情况为O(n2)O(n^2),最好的情况为O(n)O(n)

BubbleSort.gif

代码示例

public class BubbleSort {
 
  public static void main(String[] args) {
     int[] demo = {3,44,38,5,47,15,36,26};
     System.out.println("排序前:" + Arrays.toString(demo));
     sort(demo);
     System.out.println("排序后:" + Arrays.toString(demo));
  }
  
  public static void sort(int[] array){
    // 定义用于交换两列的临时变量
    int temp;
    for (int i = 0; i < array.length - 1; i++) {
       for (int j = 0; j < array.length - i - 1; j++) {
          if (array[j] > array[j+1]) {
             temp = array[j];
             array[j] = array[j+1];
             array[j+1] = temp;
          }
       }
    }   
  }
}

缺点:在不论数据是什么,都会进行比较和循环,如果数组本来就是有序的情况下,依然会进行排序。 改进:在每一次遍历去比较相邻两个数时,如果没有一次交换两列的情况,也就是相邻两个数总是满足,前一个数小于后一个数,也就是说明数组本身就是有序的。这种情况可以直接输出结果,避免不必要的循环和比较

改进方案

public class BubbleSort {
 
  public static void main(String[] args) {
     int[] demo = {3,44,38,5,47,15,36,26};
     System.out.println("排序前:" + Arrays.toString(demo));
     sort(demo);
     System.out.println("排序后:" + Arrays.toString(demo));
  }
  
  public static void sort(int[] array){
    // 定义用于交换两列的临时变量
    int temp;
    // 标识是否是有序的,默认为true
    boolean flag = true;
    for (int i = 0; i < array.length - 1; i++) {
       for (int j = 0; j < array.length - i - 1; j++) {
          if (array[j] > array[j+1]) {
             flag = false;
             temp = array[j];
             array[j] = array[j+1];
             array[j+1] = temp;
          }
       }
       if (flag) {
        break;
       } else {
         // 本次遍历是无序的,则置为true,查看下一次是否是有序的
         flag = true;
       }
    }   
  }
}