Java 归并排序

归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。

代码

 /**
	  *  将一个数组递归分割,分为两个部分,再排序合并,一直延伸下去,直至无法再分割(即数组中元素为1)
	  * 
	  */
	 public static int [] megreSort(int [] array) {
		  if(array.length<=1) {
			  return array;
			  
		  }
		 //对半分割
                int mid = array.length/2;
                int [] left = Arrays.copyOfRange(array, 0, mid);
		int [] right = Arrays.copyOfRange(array, mid, array.length);
		
		return mergeArray(megreSort(left),megreSort(right));//递归调用 
	 } 
	 
	 /**
	  * 合并两个已排好序的数组,并排序
	  * @param left
	  * @param right
	  * @return
	  */
	 public static int [] mergeArray(int [] left,int [] right) {
		 int i = 0;//控制left 数组下标
		 int j = 0;//控制right数组下标
		 int index = 0;//合并后的数组下标
		 int [] result = new int[left.length+right.length];
		 
		 for(;index<result.length;index++) {
			
			 if(i>=left.length) {
				 //left数组元素已全部合并完成,此时只有right数组的元素还有剩余未全部合并,这里直接取right数组元素
				 result[index] = right[j++];
				 
			 }else if(j>=right.length) {//这里同上
				 
				 result[index] = left[i++];
				 
			 }else if(left[i]>right[j]) {//比较并排序,这里由小到大,由于是两个排好序的数组合并,所以,每次比较拿到的都是当前两个数组的最小值
				
				 result[index] = right[j++];
				 
			 }else {
				 result[index] = left[i++];
				 
			 }
			 
		 }
		 
		 
		 return result;//将排好序的数组返回
		 
	 }

posted @ 2020-03-22 09:57  为了更美好的明天  阅读(123)  评论(0)    收藏  举报