合并排序
合并排序采用分治法不停地将待排序序列分成很小的组,通过递归的合并这些组从而实现排序。
算法步骤
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。
合并时设定两个指针,最初位置分别为两个已经排序序列的起始位置;
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
重复步骤 3 直到某一指针达到序列尾;
将另一序列剩下的所有元素直接复制到合并序列尾。
代码实现
public static int[] mergeSort(int[] nums) {
if (nums.length < 2) {
return nums;
}
int midIndex = nums.length / 2;
int[] leftArr = new int[midIndex];
int[] rightArr = new int[nums.length - midIndex];
for (int i = 0;i < nums.length;i++) {
if (i < midIndex) {
leftArr[i] = nums[i];
} else {
rightArr[i - midIndex] = nums[i];
}
}
return merge(mergeSort(leftArr), mergeSort(rightArr));
}
public static int[] merge(int[] nums1, int[] nums2) {
int[] resArr = new int[nums1.length + nums2.length];
int m = 0;
int n = 0;
int o = 0;
for (int i = 0;i < nums1.length + nums2.length;i++) {
if (nums1[m] < nums2[n]) {
resArr[o++] = nums1[m++];
} else {
resArr[o++] = nums2[n++];
}
if (m == nums1.length || n == nums2.length) {
break;
}
}
if (m < nums1.length) {
for (int i = o;i < resArr.length;i++) {
resArr[i] = nums1[i - nums2.length];
}
}
if (n < nums2.length) {
for (int i = o;i < resArr.length;i++) {
resArr[i] = nums2[i - nums1.length];
}
}
return resArr;
}