歸併排序---java實現

1、歸併排序(Merging Sort)

“歸併的含義是將兩個或者兩個以上的有序表組合成一個新的有序表”。無論是順序存儲結構還是鏈表存儲結構,夠可在O(m+n)的時間量級上實現(書中概念) 。換言之,就是將兩個有序表合併成一個。

2、一種簡單的歸併排序實現

    ① 首先將待排序列有序的化分爲若干子序列(假設是升序排序,則按照升序劃分)

    ②兩兩歸併,直至合併成一個序列

eg:

一個簡單的例子

3、java實現(非遞歸)

僅供參考

public class MergeSortTest {

	public static void main(String[] args) {
		// TODO 自動生成的方法存根
		int[] array = {49,38,65,97,76,13,27};
		mergeSortDemo(array);
		for(int x:array)
			System.out.print(x + " ");
	}
	public static void mergeSortDemo(int[] array) {
		int start1 = 0,start2 = 0,end1 = array.length-1,end2 = array.length-1;
		//1、確定第一個子序列結束的位置
		for(int i = 1; end1 < array.length;i++) {
			if(array[i] < array[i-1]) {
				end1 = i-1;
				break;
			}	
		}
		while(end1 != array.length-1) {
			//1、確定第二個子序列結束的位置
			end2 = array.length-1;
			for(int i = end1+1;i<array.length-1;i++) {
				if(array[i] > array[i+1]) {
					end2 = i;
					break;
				}
			}
			start2 = end1+1;//第二個子序列開始的位置  是 第一個子序列結束位置的下一個
			merge(array,start1,end1,start2,end2);
			end1 = end2;//下一次歸併:第一個子序列 結束的位置 是上一次歸併中第二個子序列結束的位置
		}
	}
	//歸併
	public static void merge(int[] array,int start1,int end1,int start2,int end2) {
		//將兩個有序合併爲一個
		int[] array1 = new int[end2+1];//創建一個信息數組
		for(int i = 0; i <= end1;i++)//將第一個數組賦值給array1
			array1[i] = array[i];
		//將第二個數組插入到array1中
		int index = 0;//第一次開始比較的地方
		for(int i = start2;i <= end2;i++) {
			boolean b = false;//設置當前元素是否插入
			for(int j = index;j <= end1;j++) {
				if(array1[j] > array[i]) {
					b = true;
					//從j開始 到end1向後移動
					for(int k = end1;k >= j;k--) 
						array1[k+1] = array1[k];
					array1[j] = array[i]; 
					index = j;//下一次開始比較的位置,因爲是有序表  因此下一個元素插入時 不需要從頭開始比較
					end1++;//數組1後移一個位置
					break;
				}
			}
			//判斷是否插入,如果沒插入 那麼直接將未插入的數與當前array1數組合並 並退出循環
			if(b == false) {
				for(int k = i;k<=end2;k++)
					array1[k] = array[k];
				break;
			}
		}
		//將array1賦值給array
		for(int i = 0;i < array1.length;i++) {
			array[i] = array1[i];
		}
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章