(7)归并排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26569761/article/details/76414343

思想:对于给定的一组记录,假设有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));
	}

}


猜你喜欢

转载自blog.csdn.net/qq_26569761/article/details/76414343