八大排序算法

106 阅读1分钟

一、冒泡排序

以升序为例:

  1. 从第一个元素开始,比较相邻的两个元素。如果第一个比第二个大,则进行交换。
  2. 轮到下一组相邻元素,执行同样的比较操作,再找下一组,直到没有相邻元素可比较为止,此时最后的元素应是最大的数。
  3. 除了每次排序得到的最后一个元素,对剩余元素重复以上步骤,直到没有任何一对元素需要比较为止。
void bubbleSort(int[] nums) {
    if (nums == null) return;
    int length = nums.length;
    if (length < 2) return;
    for (int i = 0; i < length; i++) {
        for (int j = 0; j < length - i - 1; j++) {
            if (nums[j] > nums[j + 1]) {
                int cache = nums[j];
                nums[j] = nums[j + 1];
                nums[j + 1] = cache;
            }
        }
    }

}

二、快速排序

三、直接插入排序

以升序为例:

  1. 循环数组,当前的元素值与前一个元素值比较,如果小于前一个值,则需要执行插入。
  2. 插入的位置,从当前元素下标开始,找到元素大于当前元素的位置。index >= 0 && arr[index] > cache
void insertSort(int[] arr) {
    if (arr == null) return;
    int length = arr.length;
    if (length < 2) return;
    for (int i = 1; i < length; i++) {
        // 升序
        if (arr[i] < arr[i - 1]) {
            int cache = arr[i];
            // 目前元素即将插入的下标
            int index;
            for (index = i - 1; index >= 0 && arr[index] > cache; index--) {
                arr[index + 1] = arr[index];
            }
            arr[index + 1] = cache;
        }
    }
    
}

四、选择排序

以升序为例:

  1. 选择排序思想的暴力实现,每一趟从未排序的区间找到一个最小元素,并放到第一位,直到全部区间有序为止。
    void selectSort(int[] arr) {
        if (arr == null) return;
        int length = arr.length;
        if (length < 2) return;

        for (int i = 0; i < length; i++) {
            int selectIndex = i;
            for (int j = i+1; j < length; j++) {
                if (arr[j] < arr[selectIndex]) {
                    selectIndex = j;
                }
            }
            if (selectIndex != i) {
                int cache = arr[i];
                arr[i] = arr[selectIndex];
                arr[selectIndex] = cache;
            }
        }

    }