常见的排序算法有三种最简单(时间复杂度都为O(n2)O(n^2))的,分别是选择排序、冒泡排序和插入排序,在此做个小小总结。

选择排序

选择排序的执行步骤为:

  1. 遍历待排序的序列,找到最小(大)的元素,和序列起始元素交换位置;
  2. 遍历剩下的待排序序列,找到最小(大)的元素,和待排序序列的起始元素交换位置;
  3. 重复第2步,直至所有元素排列完成。

算法总结-07-1

代码实现如下:

package com.test;

public class SelectionSort {
    public static void selectionSort(int[] arr){
        if(arr == null || arr.length < 2){
            return;
        }
        for(int i = 0; i < arr.length - 1; i++){
            int minIndex = i;
            for(int j = i + 1; j < arr.length; j++){
                minIndex = arr[j] < arr[minIndex] ? j : minIndex;
            }
            swap(arr, i, minIndex);
        }
    }
  
//    从大到小排序
//    public static void selectionSort(int[] arr){
//        if(arr == null || arr.length < 2){
//            return;
//        }
//        for(int i = 0; i < arr.length - 1; i++){
//            int maxIndex = i;
//            for(int j = i + 1; j < arr.length; j++){
//                maxIndex = arr[j] > arr[maxIndex] ? j : maxIndex;
//            }
//            swap(arr, i, maxIndex);
//        }
//    }
  
    // 以下写法要保证i和j不是一个位置的话
    public static void swap(int[] arr, int i, int j){
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }
  
    public static void printArray(int[] arr){
        System.out.print("数组元素为:");
        for(int num: arr){
            System.out.print(num + " ");
        }
        System.out.println();
    }
  
    public static void main(String[] args) {
        int[] arr = {2, 3, 8, 1, 3, 4, -1};
        printArray(arr);
        selectionSort(arr);
        printArray(arr);
    }
}

冒泡排序

冒泡排序的执行步骤为:

  1. 从头开始比较相邻的两个元素,如果前者比后者大(小),则交换二者位置,反之继续往右比较相邻的两个元素,一次遍历下来最右侧的元素则为待排序序列中最大(小)的元素,且不再参与下一轮遍历;
  2. 重复第1步直至所有元素排列完成。

算法总结-07-2

代码实现如下:

public class BubbleSort {
    public static void bubbleSort(int[] arr){
        if(arr == null || arr.length < 2){
            return;
        }
        for(int i = arr.length - 1; i > 0; i--){
            for(int j = 0; j < i; j++){
                if(arr[j] > arr[j+1]){
                    swap(arr, j, j+1);
                }
            }
        }
    }

//    从大到小排序
//    public static void bubbleSort(int[] arr){
//        if(arr == null || arr.length < 2){
//            return;
//        }
//        for(int i = arr.length - 1; i > 0; i--){
//            for(int j = 0; j < i; j++){
//                if(arr[j] < arr[j+1]){
//                    swap(arr, j, j+1);
//                }
//            }
//        }
//    }

    // 以下写法要保证i和j不是一个位置的话
    public static void swap(int[] arr, int i, int j){
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }

    public static void printArray(int[] arr){
        System.out.print("数组元素为:");
        for(int num: arr){
            System.out.print(num + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int[] arr = {2, 3, 8, 1, 3, 4, -1};
        printArray(arr);
        bubbleSort(arr);
        printArray(arr);
    }
}

插入排序

插入排序的执行步骤为:

  1. 首先对待排序序列的前两个元素进行比较,如果前者比后者大(小),则交换二者位置,反之继续往下执行;
  2. 接着将第3个元素与前两个排序好的元素进行比较,按照从小(大)到大(小)的顺序将其移入对应的位置;
  3. 重复第2步直至所有元素排列完成。
server-01-1
public class InsertionSort {
    public static void insertionSort(int[] arr){
        if(arr == null || arr.length < 2){
            return;
        }
        for(int i = 1; i < arr.length; i++){
            for(int j = i - 1; j >= 0 && arr[j] > arr[j+1]; j--){
                swap(arr, j, j+1);
            }
        }
    }

//    从大到小排序
//    public static void insertionSort(int[] arr){
//        if(arr == null || arr.length < 2){
//            return;
//        }
//        for(int i = 1; i < arr.length; i++){
//            for(int j = i - 1; j >= 0 && arr[j] < arr[j+1]; j--){
//                swap(arr, j, j+1);
//            }
//        }
//    }

    // 以下写法要保证i和j不是一个位置的话
    public static void swap(int[] arr, int i, int j){
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }

    public static void printArray(int[] arr){
        System.out.print("数组元素为:");
        for(int num: arr){
            System.out.print(num + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int[] arr = {2, 3, 8, 1, 3, 4, -1};
        printArray(arr);
        insertionSort(arr);
        printArray(arr);
    }
}