思想:对于给定的一组记录,假设有n个记录,首先将每两个相邻的,长度为1的子序列进行归并,得到n/2(向上取整)个长度为2或1的子序列,然后再两两归并,反复直到得到一个有序序列。
例子:
初始: [39] [28] [55] [87] [66]
一趟归并后:[28 39] [55 87] [66]
两趟归并后:[28 39 55 87] [66]
三趟归并后:[28 39 55 66 87]
/*
* 归并排序
*/
import java.lang.reflect.Array;
import java.util.Arrays;
import javax.security.auth.kerberos.KerberosKey;
public class MergeSort {
public static int[] sort(int[] nums,int left,int right){
int mid = (left + right)/2;
if (left < right){
sort(nums, left, mid);
sort(nums, mid+1, right);
Merge(nums,left,mid,right);
}
return nums;
}
public static void Merge(int[] nums,int left,int mid,int right){
int[] temp=new int[right-left+1];
int i = left;
int j = mid + 1;
int k = 0;
while(i<=mid && j<=right){
if(nums[i]<nums[j]){
temp[k++]=nums[i++];
}else{
temp[k++]=nums[j++];
}
}
while(i <= mid){
temp[k++] = nums[i++];
}
while(j <= right){
temp[k++] = nums[j++];
}
for(int k2 = 0;k2 < temp.length;k2++){
nums[k2 + left] = temp[k2];
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] nums = {2,7,4,9,3,765,2,5,87,4,4};
MergeSort.sort(nums, 0, nums.length-1);
System.out.print(Arrays.toString(nums));
}
}