算法导论——归并排序

/*--------------------归并排序------------------------*/
	@Test
	public void mergeSort(){
		int[] array = { 5, 2, 4, 6, 1, 3 };

		mergeSort(array,0,array.length-1);
		
		System.out.println(Arrays.toString(array));
	}

	private void mergeSort(int[] array, int i, int j) {
		//由于i不断变大,j不断变小,所以这里应该控制i应该小于j
		if(i<j){
			//先计算中间点位置
			int mid=(i+j)/2;
			//接着对切分的两部分分别进行归并排序
			mergeSort(array, i, mid);
			mergeSort(array, mid+1, j);
			//合并两部分
			merge(array,i,mid,j);
		}
	}

	private void merge(int[] array, int i, int mid, int j) {
		//前半部分长度
		int m=mid-i+1;
		//后半部分长度
		int n=j-mid;
		
		//创建两个数组用来存储两半部分
		int[] a=new int[m+1];
		
		int[] b=new int[n+1];
		
		//为两半部分分别设置值
		for(int k=0;k<m;k++){
			a[k]=array[i+k];
		}
		
		for(int k=0;k<n;k++){
			b[k]=array[mid+1+k];
		}
		
		//由于需要将两数组比较,逐一比较取出较小的,往原始数组的左起位置插入,为了满足当一边全部比较完了之后,另外一边能够依然作为一个较小的元素一一插入,这里,将最后一个元素设置为最大值
		a[m]=Integer.MAX_VALUE;
		b[n]=Integer.MAX_VALUE;

		//重置m,n,分别指向a、b数组的起始位置
		m=0;
		n=0;
		
		for(int k=i;k<=j;k++){
			//将切分开来的两个数组,逐一进行比较(已排序),将较小的插入原始数组,并将索引后移动一位继续比较
			if(a[m]<=b[n]){
				array[k]=a[m];
				m++;
			}else{
				array[k]=b[n];
				n++;
			}
		}
	}



你可能感兴趣的:(归并排序,算法导论)