3.归并排序Java实现

public class MergeSort {

	/**
	 * 归并排序,归并array[l,r]
	 * @param array
	 * @param l
	 * @param r
	 */
	public static void mergeSort(int array[] ,int l,int r){
		if(l>=r){
			return ;
		}
		int mid = (l+r)/2;
		//双路归并
		mergeSort(array, l, mid);
		mergeSort(array, mid+1, r);
		//归并,使array[l,mid]与array[mid+1,r]两部分合并为一个有序的数组:array[l,r]
		merge(array,l,mid,r);
	}

	/**
	 * 合并有序数组array[l,mid]与array[mid+1,r]为一个有序的数组:array[l,r]
	 * @param array
	 * @param l
	 * @param mid
	 * @param r
	 */
	private static void merge(int[] array, int l, int mid, int r) {
		//暂存待合并的数组aux[0,r]=array[l,r];
		int[] aux = Arrays.copyOfRange(array, l, r+1);
		int i=l,j=mid+1;//两个有序数组的起始值分别为i,j
		//对array的[l,r]重新赋值,形成有序数组
		for(int k=l;k<=r;k++){
			//第一个有序数组的元素已经全部在array里排好,将第二个数组的元素全部依次赋值
			if(i>mid){
				array[k]=aux[j-l];j++;
			}else if(j>r){//第二个有序数组array[mid+1,r]的元素已经全部在array里排好,将第一个数组的元素全部依次赋值
				array[k]=aux[i-l];i++;
			}else if(aux[i-l]<aux[j-l]){//将两个有序数组中小的值重新赋值给对应的array[k]
				array[k]=aux[i-l];i++;
			}else{
				array[k]=aux[j-l];j++;
			}
		}
	}
	
	public static void main(String[] args) {
		int[] array = new int [10];
		for(int i=0;i<10;i++){
			array[i]=(int)(Math.random()*10);
		}
		mergeSort(array, 0, array.length-1);
		System.out.println(Arrays.toString(array));
	}
}

猜你喜欢

转载自blog.csdn.net/cl723401/article/details/88103584
今日推荐