归并排序速记
归并排序(Merge Sort)其基本思想是将数组分成若干个子数组,分别对每个子数组进行排序,然后再将这些子数组合并成一个完整的、有序的数组。归并排序的主要优点是其稳定性(即相等元素的相对顺序在排序前后不会改变)和高效性(时间复杂度为O(n log n))。
下面是归并排序的详细步骤:
- 分解:将数组从中间分成两个子数组,如果数组长度为奇数,则其中一个子数组会多一个元素。
- 递归排序:对这两个子数组分别进行归并排序。
- 合并:将两个已排序的子数组合并成一个完整的、有序的数组。
private static void mergeSort(int[] arr, int left, int right) { if (left >= right) { return; } int middle = (left + right) >>> 1; mergeSort(arr, left, middle); mergeSort(arr, middle + 1, right); //每个小组走完左边和右边就就行排序,比如(0,1)走完(0,0)和(1,1),就会走 merge(arr, 0, 0, 1); merge(arr, left, middle, right); }
/** * 合并数组-不是递归 * * @param arr * @param left * @param middle * @param right */ private static void merge(int[] arr, int left, int middle, int right) { int s1 = left; int s2 = middle + 1; int location = 0; int[] temArr = new int[right - left + 1]; while (s1 <= middle && s2 <= right) { if (arr[s1] < arr[s2]) { temArr[location] = arr[s1]; s1++; } else { temArr[location] = arr[s2]; s2++; } location++; } while (s1 <= middle) { temArr[location] = arr[s1]; s1++; location++; } while (s2 <= right) { temArr[location] = arr[s2]; s2++; location++; } for (int i = 0; i < temArr.length; i++) { arr[left + i] = temArr[i]; } }