归并排序的原则为分而治之,主要思想为一下几个步骤
1.首先什么是“分”?就是讲每个数据集分成一个独立的小单元。
2.再次,将分割后的独立的小单元进行排序。
3.最后,将分割排序后的小单元进行两两合并,组成新的有序数据集。
如下图所示
核心代码如下:
main方法的入口,主要做两个操作,创建排序好的存放数组,和限定排序的范围
public static void mergeSort(int arr[]) { int[] temp = new int[arr.length]; mergeSort(arr, 0, arr.length - 1, temp); Arrays.stream(temp).forEach(System.out::println); }
进行递归操作,目的是将数据集分成独立的小单元,类似树的遍历(左边分割,右边分割,分割不了退回根节点,然后进行俩俩数据集合并)
public static void mergeSort(int arr[], int start, int end, int temp[]) { if (start < end) { int mid = (start + end) / 2; mergeSort(arr, start, mid, temp); mergeSort(arr, mid + 1, end, temp); merge(arr, start, mid, end, temp); } }
核心操作主要为3个步骤,第一步进行分割时候,左右数据集比较。比较完成之后,根据大小依次放入新数聚集中(一般为数组),查看左右数据集是否都进行放入存放(因为左右数据集比较时,可能存在某侧的数据集已经排序完毕,但是另一侧却存在数据未进行操作)接着需要查看两侧数据集是否都进行数据操作。最后更新之前数据的数据顺序。
private static void merge(int[] arr, int left, int mid, int right, int[] temp) { int leftIndex = left; int rightIndex = mid + 1; int tempIndex = 0; // 左右比较第一步骤 while (leftIndex <= mid && rightIndex <= right) { if (arr[leftIndex] >= arr[rightIndex]) { temp[tempIndex++] = arr[rightIndex++]; } else { temp[tempIndex++] = arr[leftIndex++]; } } //补充数据,第二步骤 while(leftIndex<= mid ){ temp[tempIndex++] = arr[leftIndex++]; } while (rightIndex<=right){ temp[tempIndex++] = arr[rightIndex++]; } tempIndex = 0; //将temp中的元素全部拷贝到原数组中,第三步骤 while (left <= right) { arr[left++] = temp[tempIndex++]; } }