排序算法
一、选择排序
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)); } }