1. 程式人生 > >Java常用的八種排序演算法與程式碼實現(一):氣泡排序法、插入排序法、選擇排序法

Java常用的八種排序演算法與程式碼實現(一):氣泡排序法、插入排序法、選擇排序法

這三種排序演算法適合小規模資料排序

---
  共同點:基於比較,時間複雜度均為O(n2),空間複雜度均為O(1)(原地排序演算法)
  不同點:插入排序和氣泡排序是穩定的排序演算法,選擇排序不是
---
  穩定排序演算法:可以保持數值相等的兩個物件,在排序之後的順序不變

---
  氣泡排序:只操作相鄰的兩個數,每次進行的操作只對相鄰的兩個數進行比較,看是否滿足條件,一次冒泡至少會移動一個數到它應該存在的位置,重複n次,就完成了資料的排序。每次操作都會將較小值往前推,較大值往後推,所以可能迴圈未結束時,排序工作已經被完成
  圖解:
  在這裡插入圖片描述  程式碼:

 /**
   * 氣泡排序
   *
   * @param arr 待排陣列
   */
  public static void bubbleSort(int[] arr) {
    int c;
    for (int i = 0; i < arr.length; i++) {
      for (int j = arr.length - 1; j > i; j--) {
        if (arr[j] < arr[j - 1]) {
          c = arr[j];
          arr[j] = arr[j - 1];
          arr[j - 1] = c;
        }
      }
    }
  }

---
  插入排序:兩種操作,一種時元素的比較,一種是元素的移動,當我們需要將一個元素a插入已排區間時,需要拿a與已排區間的元素依次比較大小,找到合適的位置插入,還需要將插入點的元素位置進行移位,這樣才能騰出後面的位置給元素a
  圖解:
  在這裡插入圖片描述
  程式碼:

 /**
   * 插入排序
   *
   * @param arr 待排陣列
   */
  public static void insertSort(int[] arr) {
    int c;
    for (int i = 1; i < arr.length; i++) {
      for (int j = 0; j < i; j++) {
        if (arr[j] > arr[i]) {
          c = arr[j];
          arr[j] = arr[i];
          arr[i] = c;
        }
      }
    }
  }

---
  選擇排序:基本同插入排序,區分已排區間和未排區間,每次遍歷會找到未排區間內的最小元素,將其放到已排區間的末尾
  圖解:
  在這裡插入圖片描述  程式碼:

 /**
   * 選擇排序
   *
   * @param arr 代排陣列
   */
  public static void selectionSort(int[] arr) {
    for (int i = 0; i < arr.length; i++) {
      int min = i;
      for (int j = i; j < arr.length; j++) {
        if (arr[j] < arr[min]) {
          min = j;
        }
      }
      int c = arr[min];
      arr[min] = arr[i];
      arr[i] = c;
    }
  }

---
  (補充:還有一種排序叫做希爾排序,希爾排序是特殊的插入排序,通過將全部元素分為幾個區間來提高插入排序的效能,會選定一個步長,然後逐漸將步長縮短,當步長為1的時候,直接使用插入排序,參考:https://www.cnblogs.com/chengxiao/p/6104371.html)

---
  測試方法及生成隨機陣列方法:

 /**
   * 生成一個長度5-10的隨機陣列
   *
   * @return 隨機陣列
   */
  private static int[] initArray() {
    int len = 5 + new Random().nextInt(6);
    int[] arr = new int[len];
    for (int i = 0; i < arr.length; i++) {
      arr[i] = new Random().nextInt(100);
    }
    return arr;
  }
  
 public static void main(String[] args) {
    int[] arr2 = initArray();
    System.out.println("排序之前的陣列是:" + Arrays.toString(arr2));
    selectionSort(arr2);
    System.out.println("排序之後的陣列是:" + Arrays.toString(arr2));
  }

---
測試結果,親測有效:

冒泡:
  排序之前的陣列是:[95, 31, 52, 89, 6, 7, 55]
  排序之後的陣列是:[6, 7, 31, 52, 55, 89, 95]
插入:
  排序之前的陣列是:[5, 83, 56, 78, 38, 24, 70, 95]
  排序之後的陣列是:[5, 24, 38, 56, 70, 78, 83, 95]
選擇:
  排序之前的陣列是:[26, 1, 74, 16, 44, 28, 2]
  排序之後的陣列是:[1, 2, 16, 26, 28, 44, 74]