horizonheart 2020-07-19
归并排序介绍:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
/** * 分解 * * @param arr 数组 * @param left 左边起点 * @param right 右边终点 * @param temp 转换数组 */ public static void mergeSort(int[] arr, int left, int right, int[] temp) { int mid = (left + right) / 2; if (left < right) { //左分 mergeSort(arr, left, mid, temp); //右分 mergeSort(arr, mid + 1, right, temp); //左右合并 merge(arr, left, mid, right, temp); } //合并 } /** * 合并 * * @param arr 数组 * @param left 左边开始 * @param mid 右边开始 * @param right 右边结束 * @param temp 转换数组 */ public static void merge(int[] arr, int left, int mid, int right, int[] temp) { int t = 0;//临时数组开始下标 int leftIndex=left;//左边开始下标 int midIndex=mid+1;//右边开始下标 while (leftIndex <= mid&&midIndex<=right) { //两边进行比较 小的放入临时数组 if (arr[leftIndex] <= arr[midIndex]) { temp[t] = arr[leftIndex]; t++; leftIndex++; } else { temp[t] = arr[midIndex]; t++; midIndex++; } } //右边全部比较完毕左边有剩余 while (leftIndex<=mid){ temp[t] = arr[leftIndex]; t++; leftIndex++; } //左边全部比较完毕右边有剩余 while (midIndex<=right){ temp[t] = arr[midIndex]; t++; midIndex++; } //全部比较完毕 从临时数组放入到arr中 t=0; for (int i=left;i<=right;i++){ arr[i]=temp[t++]; } }
排序是将一串数据按照其某个或者某些关键字的大小进行递增或递减排列的操作我,通常指的排序是升序,排序方式是原地排序。即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并