1. 程式人生 > >歸併排序的java實現(超詳解)

歸併排序的java實現(超詳解)

歸併排序,見名知意,就是遞迴+合併

原理:

使用遞迴的手段,達到分割的目的,在分割後進行合併,合併也是遞迴的,這就是這裡的雙向過程都是遞迴進行的,結果如圖:

示例(例項):

以一下一串數字為例,首先進行拆分,然後合併,在合併的過程,進行排序,這裡需要說明的是,遞迴在整個過程中都是存在的,不是單單拆分和合並存在遞迴。特別是在合併的過程中的排序不是那麼簡單,在採用專門合併兩個有序陣列的方式進行合併排序,後面把程式碼貼出來,怎麼能夠保證我們需要排序的兩個陣列是有序的呢?這裡就特別巧妙的運用遞迴進行拆分,拆分到最小單位時的陣列肯定能夠保證是有序的,特別巧妙,而且排序的過程仔細就回發現,如果給出的不是有序陣列,那麼不能保證排序的結果是真正有序的,過程看不懂沒有關係,看下程式碼就能明白。

 

程式碼1(這個程式碼是粘的這篇部落格的:https://blog.csdn.net/u014672511/article/details/80593436):

package order;

import java.util.Arrays;

public class merge2Arr {
	public static int[] merge2Arr(int[] arr1, int[] arr2) {
		  int len1 = arr1.length;
		  int len2 = arr2.length;
		  int[] res = new int[len1 + len2];  
		  int i = 0, j = 0, k = 0;
		  while(i < len1 && j < len2) {
		    res[k++] = arr1[i] < arr2[j]? arr1[i++] : arr2[j++];
		  }
		  while(i < len1) {
		    res[k++] = arr1[i++];
		  }
		  while(j < len2) {
		    res[k++] = arr2[j++];
		  }
		  return res;
		}
	
	
	public static void main(String[] args) {
		int[] arr1= {1,4,76,5,3}; 
		int[] arr2={5,66,76,3,9};
		int[] aaa=merge2Arr(arr1, arr2);
		System.out.println(Arrays.toString(aaa));
	}
	
	
}

 歸併排序的全程式碼:

package order;
import java.util.Arrays;
public class _merge2 {
	public static void merge(int[] a, int low,int mid,int high) {
		 
		 //建立左右兩個陣列
		 int[] L=new int[mid-low+1];
		 int[] R=new int[high-mid];
		 //給左右陣列賦值
		 int i1,j1;
		 for (i1= 0,j1=low; i1< L.length; i1++) 
		     L[i1]=a[j1++];
		 int i2,j2;
		 for (i2= 0,j2=mid+1; i2< R.length; i2++) 
		     R[i2]=a[j2++];
		//拿來放臨時資料
		 int[] temp=new int[high-low+1];
		 int i3=0;
		 int j3=0;
		 int k1=0;
		while (i3<L.length&&j3<R.length) {
			if (L[i3]<R[j3]) {
				temp[k1++]=L[i3++];
			}else {
				temp[k1++]=R[j3++];
			}
		}
		//放剩下未放完的左資料(此時右資料已經放完)
		if (i3<mid-low+1&&j3>=high-mid) {
			for (int j5= i3; j5 <mid-low+1; j5++,k1++) {
				temp[k1]=L[j5];
			}
		}
		
		//放剩下未放完的右資料(此時左資料已經放完)
		if (j3<high-mid&&i3>=mid-low+1) {
			for (int i5= j3; i5 <high-mid; i5++,k1++) {
				temp[k1]=R[i5];
			}
		}
		if (k1<=high ) {
			for (int j4 = 0; j4 < temp.length; j4++) {
				a[j4]=temp[j4];
			}
			
		}
		
	}
	
	public static void mergeSort(int[] a,int lo,int hig) {
		if (lo<hig) {
			int mid=(hig+lo)/2;
			int[] Le=new int[mid+1];
			int[] Ri=new int[hig-mid];
			mergeSort(Le,lo,mid); 
			mergeSort(Ri,mid+1,hig);
			merge(a, lo, mid, hig);
		}
	}
	//測試一下
	public static void main(String[] args) {
		int[] aa= {22,5,3,3,8,3,0,5,6,11};
		mergeSort(aa,0,aa.length-1);
		System.out.println(Arrays.toString(aa));
	}
}