一、什么是归并排序
学过数据结构的同学应该都知道,合并两个有序数组为一个整体有序的数组。这其实就是一次merge操作。而归并排序中最重要的就是merge操作。
具体的看一张wiki上的图
整个归并操作分两块:第一,merge操作;第二,分治。
二、Java 代码
public void merger(int[] nums, int first, int mid, int last, int[] tmp){
int i = first, j = mid;
int m = mid + 1, n = last;
int k = 0;
while(i<=j&&m<=n){
if (nums[i]<=nums[m]) {
tmp[k++] = nums[i++];
}else {
tmp[k++] = nums[m++];
}
}
while(i<=j){
tmp[k++] = nums[i++];
}
while(m<=n){
tmp[k++] = nums[m++];
}
for (i = 0; i < k; i++)
nums[first + i] = tmp[i];
}
public void mergeSort(int[] nums, int first, int last, int[] tmp){
if (first < last) {
int mid = (first + last)/2;
mergeSort(nums, first, mid, tmp);//sort left side
mergeSort(nums, mid+1, last, tmp);//sort left side
merger(nums, first, mid, last, tmp);
}
}
具体的调用
对象.mergeSort(nums, 0, nums.length-1, new int[nums.length]);