排序算法

一、选择排序

package org.shydow.structure.sort;

/**
 * @author Rainbow
 * @date 2021/11/29 21:43
 * @desc 时间复杂度:O(n^2)
 */
public class CodeSelectSort {

    public static void SelectionSort(int[] arr) {
        if (null == arr || 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++) {
                if (arr[minIndex] > arr[j]) {
                    minIndex = j;
                }
            }
            Swap(arr, i, minIndex);
        }
    }

    private static void Swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
}

 

二、冒泡排序

package org.shydow.structure.sort;

/**
 * @author Rainbow
 * @date 2021/11/30 7:58
 * @desc 时间复杂度O(n^2)
 */
public class CodeBubbleSort {

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

}

 

三、插入排序

/**
 * 插入排序: O(n^2) -> 最差情况下, 取决数据顺序度,O(n) ~ O(n^2)
 *
 * @param arr
*/

public static void insertSort(int[] arr) { if (arr == null || arr.length < 2) { return; } // 0~0 有序 0~1 想有序 for (int i = 1; i < arr.length; i++) { // 0~N有序 for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) { int tmm = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmm; } } }

 

四、归并排序 

  其实是一种分而治之的过程,归并排序递归公式(符合Master公式):T(N) = 2T(N/2) + O(N) ,分即将原数组划分为两个子数组的过程,治即将两个数组合并为一个更大的数组,举个例子,假设一个数组是[12, 45, 21, 3, 16, 8, 31, 42]:

  1)分成两个大小相等的数组:[12, 45, 21, 3]   [16, 8, 31, 42]

  2)再划分为为四个大小的子数组:[12, 45] [21, 3] [16, 8] [31, 42]

  3)再进行划分,将分为8个数组,每个数组中只有一个元素,单个元素是有序的,再进行merge,可以看做是一个二叉树,合并过程是一次后续遍历

package org.shydow.structure.sort;

import java.util.Arrays;

/**
 * @author shydow
 * @date 2021/12/15 21:54
 */
public class CodeMergeSort {

    private static void process(int[] arr, int L, int R) {
        if (L == R) return;
        int mid = L + ((R - L) >> 1);
        process(arr, L, mid);
        process(arr, mid + 1, R);
        merge(arr, L, R, mid);
    }

    private static void merge(int[] arr, int L, int R, int M) {
        int[] help = new int[R - L + 1];
        int i = 0;
        int p1 = L;
        int p2 = M + 1;
        while (p1 <= M && p2 <= R) {
            help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];
        }
        while (p1 <= M) {
            help[i++] = arr[p1++];
        }
        while (p2 <= R) {
            help[i++] = arr[p2++];
        }
        for (int j = 0; j < help.length; j++) {
            arr[L + j] = help[j];
        }
    }

    public static void main(String[] args) {
        int[] arr = {31, 8, 2, 16, 44, 23, 45, 36};
        process(arr,  0, 7);
        System.out.println(Arrays.toString(arr));
    }
}

 

posted @ 2021-11-29 22:02  Shydow  阅读(37)  评论(0编辑  收藏  举报