一、基本概念
归并排序是将两个有序序列合并成一个有序序列的过程。
二、排序过程:
-
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
-
设定两个指针,最初位置分别为两个已经排序序列的起始位置
-
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
-
重复步骤3直到某一序列的指针达到序列尾
-
将另一序列剩下的所有元素直接复制到合并序列尾,一次归并结束
三、相关代码
package com.lte; import java.util.Arrays; public class MergeSort { public static void main(String[] args) { int[] a = { 57, 68, 59, 52, 72, 28, 96, 33 }; sort(a, 0, a.length - 1); } public static void sort(int[] a, int left, int right) { if (left >= right) return; int center = (left + right) >> 1; sort(a, left, center); sort(a, center + 1, right); merge(a, left, center, right); } public static void merge(int[] data, int left, int center, int right) { int[] tmpArr = new int[right + 1]; int mid = center + 1; int index = left; // index记录临时数组的索引 int tmp = left; // 从两个数组中取出最小的放入中临时数组中 while (left <= center && mid <= right) { tmpArr[index++] = (data[left] <= data[mid]) ? data[left++] : data[mid++]; } // 剩余部分依次放入临时数组 while (mid <= right) { tmpArr[index++] = data[mid++]; } while (left <= center) { tmpArr[index++] = data[left++]; } // 将临时数组中的内容复制回原数组 for (int i = tmp; i <= right; i++) { data[i] = tmpArr[i]; } System.out.println(Arrays.toString(data)); } }
运行结果:
[57, 68, 59, 52, 72, 28, 96, 33] [57, 68, 52, 59, 72, 28, 96, 33] [52, 57, 59, 68, 72, 28, 96, 33] [52, 57, 59, 68, 28, 72, 96, 33] [52, 57, 59, 68, 28, 72, 33, 96] [52, 57, 59, 68, 28, 33, 72, 96] [28, 33, 52, 57, 59, 68, 72, 96]