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

java實現的歸併排序詳解

歸併排序的基本原理為:

一:拆分,假設有N個元素的列表,將這個列表拆分成2個或兩個以上元素組成的新的列表,然後分別對子列表進行排序

二:歸併,把所有的排好序的子類表兩兩歸併,如此重複,直到歸併成一個含N個有序列表為止

歸併排序其實和快速排序都是同一種思想的排序演算法,其採用的都是分治法的基本思想,即:將問題分解成一個個小的問題,分而治之。

public class Mergesort {

	/*
	 * leftPos左陣列的第一個元素的下標
	 * leftEnd左陣列的最後一個元素的下標
	 * rightPos右陣列第一個元素的下標
	 * rightEnd 右陣列最後一個元素的下標*/
	private static <Integer extends Comparable<? super Integer>> void meger(int []a,
			int[]tmpArray,int  leftPos,int rightPos,int rightEnd){
		int leftEnd = rightPos-1;
		int tmpPos = leftPos;
		int numElements = rightEnd - leftPos +1;
		//將兩陣列最最小的放入陣列tmpArrray中
		while(leftPos<=leftEnd&&rightPos<=rightEnd){
			if(a[leftPos]-(a[rightPos])<=0){
				tmpArray[tmpPos++] = a[leftPos++];
			}else{
				tmpArray[tmpPos++]=a[rightPos++];
			}
		}
		//兩陣列中的另外一個數組的元素放入temArray中
		while(leftPos<=leftEnd){
			tmpArray[tmpPos++]=a[leftPos++];
		}
		while(rightPos<=rightEnd){
			tmpArray[tmpPos++]=a[rightPos++];
		}
		//將中間陣列中的內容複製回原陣列
		for(int i=0;i<numElements;i++,rightEnd--){
			a[rightEnd]=tmpArray[rightEnd];
		}
		for(int i = 0;i<tmpArray.length;i++){
			System.out.print(tmpArray[i]+",");
		}
		System.out.println();
	}
	/*
	 * left 待排陣列的第一個元素的索引
	 * right 待排陣列的最後一個元素的索引
	 * a 待排陣列
	 * tmpArray 歸併後的陣列
	 * center左邊陣列的最後一個元素的下標 */
	private static <Integer extends Comparable <? super Integer>> void mergeSort(int[]a,
			int []tmpArray,int left,int right){
		if(left<right){
			int center =(left+right)/2;
			//對左邊陣列進行遞迴,在遞迴的過程中直到將左邊陣列拆分成元素為一的新的陣列
			mergeSort(a,tmpArray,left,center);
			//對左邊陣列進行遞迴,在遞迴的過程中直到將右邊陣列拆分成元素為一的新的陣列
			mergeSort(a,tmpArray,center+1,right);
			//合併陣列
			meger(a,tmpArray,left,center+1,right);
		}
	}
	public static void main(String[] args) {
		Mergesort sort = new Mergesort();
		int num[]={5,7,3,8,1,4,9,2,6};
		int num2[] = new int[9];
		sort.mergeSort(num, num2, 0, num.length-1);
		for (int i = 0; i < num2.length; i++) {
			System.out.print(num2[i]+",");
		}
		System.out.println();
		for (int i = 0; i < num2.length; i++) {
			System.out.print(num[i]+",");
		}
	}
}
輸出結果為:

每次數組合並之後的結果:

5,7,0,0,0,0,0,0,0, 
3,5,7,0,0,0,0,0,0, 
3,5,7,1,8,0,0,0,0, 
1,3,5,7,8,0,0,0,0, 
1,3,5,7,8,4,9,0,0, 
1,3,5,7,8,4,9,2,6, 
1,3,5,7,8,2,4,6,9, 
1,2,3,4,5,6,7,8,9,

所有數組合並完成之後的陣列 1,2,3,4,5,6,7,8,9,

原有的陣列排序之後: 1,2,3,4,5,6,7,8,9,