归并排序 转https://www.cnblogs.com/chengxiao/p/6194356.html
package com.anim.myapplication; public class SortTest { private static int[] arr = {34, 45, 2, 35, 34, 52, 23, 4, 3, 8}; private static int len; public static void main(String[] args) { len = arr.length; System.out.println("排序前:"); printList(len); // selectSort(); // insertSort(); // mergeSort();//这个是从整体一步步拆分的思路, mergeSortDown2Up();//这种思路是先分组在合并 System.out.println("排序后 "); printList(len); } private static void printList(int len) { for (int i = 0; i < len; i++) { System.out.print(" " + arr[i]); } System.out.println(); } //选择排序 一次选择一个最小值,记录最小值的位置,交换最小值和当前第一个的位置 private static void selectSort() { int minIndex = 0; int temp = 0; for (int i = 0; i < len; i++) { minIndex = i; for (int j = i + 1; j < len; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } } //插入排序 两种循环都可以 private static void insertSort() { int temp; // for (int i = 1; i < len; i++) { // for (int j = 0; j < i; j++) { // if (arr[j] > arr[i]) { // temp = arr[j]; // arr[j] = arr[i]; // arr[i] = temp; // } // } // } for (int i = 0; i < len; i++) { for (int j = i; j > 0; j--) { if (arr[j] < arr[j - 1]) { temp = arr[j]; arr[j] = arr[j - 1]; arr[j - 1] = temp; } } } } public static void mergeSort() { int temp[] = new int[arr.length]; mergeSort(0, len - 1, temp); } public static void mergeSort(int left, int right, int[] temp) { if (left < right) { int mid = (left + right) / 2; mergeSort(left, mid, temp); mergeSort(mid + 1, right, temp); merge(left, mid, right, temp); } } public static void merge(int left, int mid, int right, int[] temp) { int i = left; int j = mid + 1; int k = 0; while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } k = 0; while (left <= right) { arr[left++] = temp[k++]; } } public static void mergeSortDown2Up() { int[] temp = new int[arr.length]; for (int d = 1; d < len; d = d * 2) { mergeGroups(d, temp); } } public static void mergeGroups(int groupLen, int[] temp) { int i; int twolen = 2 * groupLen; for (i = 0; i + twolen - 1 < len; i = i + twolen) { System.out.println("mergeGroups for i = " + i + " grouplen = " + groupLen); merge(i, i + groupLen - 1, i + twolen - 1, temp); } System.out.println("mergeGroups i = " + i); if (i + groupLen - 1 < len - 1) { merge(i, i + groupLen - 1, len - 1, temp); } } }