归并排序

这里只写了两个方法,一个是排序递归的方法,另一个是辅助的方法,把拆分出的数组合并起来。对递归的实现原理还是不能很深刻的理解,每次写到递归的时候就容易出错,这就是人与计算机的差别吧,我还是没法深刻的理解计算机啊。上代码

        /**
	 * 归并排序:把大的问题分成小的问题依此解决然后合并起来采用递归的方式来进行
	 */
	public static void mergeSort(int[] a){
		int l=a.length;
		int middle=a.length/2;
		if(l>1){
			int[]left=Arrays.copyOfRange(a,0,middle);//拷贝数组array的左半部分
			int[]right=Arrays.copyOfRange(a,middle,l);
			mergeSort(left);
			mergeSort(right);
			merge(a,left,right);	
		}
	}
	//合并把左右数组合进原数组
	public static void merge(int[] a,int[] left,int[] right){
		int lIndex=0;//是L小写可不是1,2,3,的1
		int rIndex=0;
		while(lIndex<left.length&&rIndex<right.length){
			if(left[lIndex]>right[rIndex]){
				a[lIndex+rIndex]=right[rIndex];
				rIndex++;
			}else{
				a[lIndex+rIndex]=left[lIndex];
				lIndex++;
			}
		}
		while(lIndex<left.length){
			a[lIndex+rIndex]=left[lIndex];
			lIndex++;
		}
		while(rIndex<right.length){
			a[lIndex+rIndex]=right[rIndex];
			rIndex++;
		}
	}

略去了main方法和类Arrays是jdk里的,把数组拆分并非难点,难点在我看来是1、对递归的应用,2、合并时的逻辑。刚开始甚至理解错误了。

    先来理解合并的算法,就拿我们上学的班级来说吧,两列已经排好的队伍,AB 要合成队伍c只要取出两队排头的比较个子低的先进入c队,随后继续比较队伍的头,当一队清空后,直接剩余学生插入队伍尾部即可。

    拆分的方法就是对半的分了,分到只有一个的时候是不需要比较的了!

    其实可以拆分为多个数组,然后多个进行排列比较。


你可能感兴趣的:(算法)