7.归并排序

归并排序时间复杂度O(N*logN),额外空间复杂度O(N)

具体实现过程请观看算法(c语言版)之归并排序

package yzy.algorithm;

public class testMergeSort {
	
	public static void mergeSort(int[] arr) { 
		if(arr == null || arr.length<2)
			return;
		sortProcess(arr, 0, arr.length-1);
	}
	
	//实际排序的递归过程
	public static void sortProcess(int[] arr, int L, int R) {
		if(L == R)
			return;
//		int mid = (L-R)/2 + R;
		int mid = ((L-R)>>1) + R;
		sortProcess(arr, L, mid);
		sortProcess(arr, mid+1, R);
		merge(arr, L, mid, R);
	}
	
	public static void merge(int[] arr, int L, int mid, int R) {
		int[] help = new int[R-L+1];  //开辟与要排序的数组相同大小额外的空间
		int i = 0;
		int p1 = L;
		int p2 = mid+1;
		while(p1<=mid && p2<=R) {
			help[i++] = arr[p1]<arr[p2] ? arr[p1++] : arr[p2++];
		}
		while(p1 <= mid) {
			help[i++] = arr[p1++];
		}
		while(p2<=R) {
			help[i++] = arr[p2++];
		}
		for(i=0; i<help.length; ++i) {
			arr[i+L] = help[i];
		}
	}
	
	public static void main(String[] args) {
		/*
		 * 疑惑????
		 * 验证后发现是运算符优先级的原因
		 * +优先级高于>>(移位操作符)
		 * (L-R)/2 + R尽量不要用负数做被除数,可能导致最终的结果不正确,要想保证结果正确,永远都要是大数减小数
		 * ((L-R)>>1) + R随意
		 */
		int L = 0, R = 3;
		int mid1 = (L-R)/2 + R;
		int mid2 = (R-L)/2 + L;
		
		int mid3 = ((L-R)>>1) + R;
		int mid4 = (L-R)>>1 + R;
		
		int mid5 = R + (L-R)>>1;
		int mid6 = R + ((L-R)>>1);
		
		//尽量不要用负数做被除数,可能会不正确
		System.out.println("(L-R)/2 + R: "+ mid1);  //error
		System.out.println("(R-L)/2 + L: "+ mid2);
		System.out.println("(L-R)/2: "+ (L-R)/2);  //-1+3
		System.out.println("(R-L)/2: "+ (R-L)/2);  //1+0
		
		// +优先级高于>>
		System.out.println("((L-R)>>1) + R: "+ mid3);
		System.out.println("(L-R)>>1 + R: "+ mid4);  //error +优先级高于>>
		
		// +优先级高于>>
		System.out.println("R + (L-R)>>1: "+ mid5);  //error +优先级高于>>
		System.out.println("R + ((L-R)>>1)): "+ mid6);
	}
}

发布了188 篇原创文章 · 获赞 65 · 访问量 8388

猜你喜欢

转载自blog.csdn.net/qq_43808700/article/details/104252995