排序总结[5]_归并排序

归并排序是典型的分治策略。

  • 归并操作:是合并两个已经排序的表,其思路是,设定两个指针p1和p2分别指向两个表,再新建一个临时数组,然后比较p2和p1把小的放进临时数组中,且对应的指针右移,重复此过程直到移动完成。
  • 归并排序定义:如果N=1,那么只有一个元素需要排列,答案是显而易见的,否则递归的将前半部分和后半部分分别进行归并排序,得到排序后的数组,使用上面描述的归并操作进行合并即可。
void mergeort(int[] arr){
	if(arr==null)throw new NullPointerException();
	if(arr.length<=1)return;
	int[] tmpArray = new int[arr.length];
	mergeortCore(arr,0,arr.length-1,tmpArray);
}
void mergeortCore(int[] arr,int left,int right,int[] tmpArray){
	//递归出口
	if(left<right){
		int center = left + ((right-left)>>>1);//notice
		//1.分别对左右两部分递归排序
		mergeortCore(arr,left,center,tmpArray);
		mergeortCore(arr,center+1,right,tmpArray);
		//2.然后合并左右两部分即可
		int p1=left,p2=center+1;
		int k=left;
		while(p1<=center && p2<=right){
			if(arr[p1]<=arr[p2]){
				tmpArray[k++]=arr[p1++];
			}else{
				tmpArray[k++]=arr[p2++];
			}
		}
		while(p1<=center)
			tmpArray[k++]=arr[p1++];
		while(p2<=right)
			tmpArray[k++]=arr[p2++];
		for(int i=right,k=right;i>=left;--i){//copy data back to arr
			arr[i]=tmpArray[k--];
		}
	}
}
原文地址:https://www.cnblogs.com/lhyblog/p/5902573.html