四种经典的排序算法
一、冒泡排序
public static void main(String[] args) { int[] arr = { 1, 0, 3, 4, 5, -6, 7, 8, 9, 10 }; System.out.println("原始数据: " + Arrays.toString(arr));
for (int i = 1; i < arr.length; i++) { for (int j = 0; j < arr.length - i; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } System.out.println("冒泡排序: " + Arrays.toString(arr)); }
二、插入排序
public static void main(String[] args) { int[] arr = { 2, 3, 5, 1, 23, 6, 78, 34 }; System.out.println("原始数据: " + Arrays.toString(arr)); for (int i = 1; i < arr.length; i++) { int temp = arr[i]; int j = i - 1; for (; j >= 0; j--) { if (arr[j] > temp) { arr[j + 1] = arr[j]; } else { break; } } arr[j + 1] = temp; } System.out.println("插入排序: " + Arrays.toString(arr)); }
三、归并排序
public static void main(String[] args) { int[] arr = { 49, 38, 65, 97, 76, 13, 27, 50 }; System.out.println("原始数据: " + Arrays.toString(arr)); customMergeSort(arr, 0, arr.length - 1); System.out.println("归并排序: " + Arrays.toString(arr)); } public static void customMergeSort(int[] a, int start, int end) { if (start < end) { int mid = (start + end) / 2; // 对左侧子序列进行递归排序 customMergeSort(a, start, mid); // 对右侧子序列进行递归排序 customMergeSort(a, mid + 1, end); // 合并 customDoubleMerge(a, start, mid, end); } } public static void customDoubleMerge(int[] a, int left, int mid, int right) { int[] tmp = new int[a.length]; int p1 = left, p2 = mid + 1, k = left; while (p1 <= mid && p2 <= right) { if (a[p1] <= a[p2]) tmp[k++] = a[p1++]; else tmp[k++] = a[p2++]; } while (p1 <= mid) tmp[k++] = a[p1++]; while (p2 <= right) tmp[k++] = a[p2++]; // 复制回原素组 for (int i = left; i <= right; i++) a[i] = tmp[i]; }
四、快速排序
public static void main(String[] args) { int[] arr = { 6, 1, 2, 7, 9, 11, 4, 5, 10, 8 }; System.out.println("原始数据: " + Arrays.toString(arr)); customQuickSort(arr, 0, arr.length - 1); System.out.println("快速排序: " + Arrays.toString(arr)); } public static void customQuickSort(int[] arr, int low, int high) { int i, j, temp, t; if (low >= high) { return; } i = low; j = high; temp = arr[low]; while (i < j) { // 先看右边,依次往左递减 while (temp <= arr[j] && i < j) { j--; } // 再看左边,依次往右递增 while (temp >= arr[i] && i < j) { i++; } t = arr[j]; arr[j] = arr[i]; arr[i] = t; } arr[low] = arr[i]; arr[i] = temp; // 递归调用左半数组 customQuickSort(arr, low, j - 1); // 递归调用右半数组 customQuickSort(arr, j + 1, high); }