二. 三傻排序算法.md

17 阅读2分钟

选择排序

image.png 从第一位开始,取从这位开始最小的值,记住最小值的位置,然后把这个值和最开始的值做交换,这样每次都能把未排序数组中的最小值找出来,放到前面来,实现排序。

  public static void main(String[] args) {
    int[] intArray = {6, 3, 2, 1, 5};
    selectionSort2(intArray);
  }
​
  // 数组中交换i和j位置的数
  public static void swap(int[] arr, int i, int j) {
    int tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
  }
​
  // 打印数组
  public static <T> void printArray(int[] array) {
    System.out.println(Arrays.toString(array));
  }
​
  public static void selectionSort2(int[] arr) {
    printArray(arr);
    if (arr == null || arr.length == 1) {
      return;
    }
    for (int i = 0; i < arr.length - 1; i++) {
      int min = arr[i];
      int minIndex = i;
      for (int j = i; j < arr.length; j++) {
        if (arr[j] <= min) {
          min = arr[j];
          minIndex = j;
        }
      }
      swap(arr, i, minIndex);
      printArray(arr);
    }
  }

打印如下

[6, 3, 2, 1, 5]
[1, 3, 2, 6, 5]
[1, 2, 3, 6, 5]
[1, 2, 3, 6, 5]
[1, 2, 3, 5, 6]

冒泡排序

image.png 从第一位开始,比较他和他后面的那一位数,大的往后,这样一轮下来,最大的数就到最后一位,下一轮最后一位数就不用参与了

  public static void main(String[] args) {
    int[] intArray = {6, 3, 2, 1, 5};
    bubbleSort2(intArray);
  }
​
  // 数组中交换i和j位置的数
  public static void swap(int[] arr, int i, int j) {
    int tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
  }
​
  // 打印数组
  public static <T> void printArray(int[] array) {
    System.out.println(Arrays.toString(array));
  }
​
  public static void bubbleSort2(int[] arr) {
    printArray(arr);
    if (arr == null || arr.length == 1) {
      return;
    }
    for (int i = 0; i < arr.length - 1; i++) {
      for (int j = 0; j < arr.length - i - 1; j++) {
        if (arr[j] > arr[j+1]) {
          swap(arr, j, j+1);
        }
      }
​
      printArray(arr);
    }
  }

打印如下

[6, 3, 2, 1, 5]
[3, 2, 1, 5, 6]
[2, 1, 3, 5, 6]
[1, 2, 3, 5, 6]
[1, 2, 3, 5, 6]

插入排序

image.png 其实就是从 2 位开始,每次都把它和前面的数比较,如果比它大,就交换,如果比它小,说明前面的都比它小,因为前面的已经排完序了,就停止。

  public static void main(String[] args) {
    int[] intArray = {6, 3, 2, 1, 5};
    insertionSort2(intArray);
  }
​
  // 数组中交换i和j位置的数
  public static void swap(int[] arr, int i, int j) {
    int tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
  }
​
  // 打印数组
  public static <T> void printArray(int[] array) {
    System.out.println(Arrays.toString(array));
  }
​
  public static void insertionSort2(int[] arr) {
    printArray(arr);
    if (arr == null || arr.length == 1) {
      return;
    }
    for (int i = 1; i < arr.length; i++) {
      for (int j = i; j > 0; j--) {
        if (arr[j] < arr[j-1]) {
          swap(arr, j, j-1);
        } else {
          break;
        }
      }
      printArray(arr);
    }
  }

打印如下

[6, 3, 2, 1, 5]
[3, 6, 2, 1, 5]
[2, 3, 6, 1, 5]
[1, 2, 3, 6, 5]
[1, 2, 3, 5, 6]