大範圍歸併小範圍插入排序

首先介紹歸併和插入的算法思想,其實現細節可以參考博客http://java--hhf.iteye.com/blog/2034925/,然後再具體實現本文主要介紹的“大範圍歸併小範圍插入排序”

(一)插入排序

算法執行思路如圖

 實現算法:


 

(二)歸併排序(分治法)

先將源數據分成一個一個的小組,然後兩兩合併即是

 

合併兩個數據的實現思路:(將L,R合併爲A返回)


時間複雜度


(三)


/**
 * 先插入排序再歸併
 * 時間複雜度 nk+nlg(kn)
 * @author HHF
 * 2014年11月24日
 */
public class MergeInsert {
        private static final int k = 1000;
	public static void main(String[] args) {
		int[] array = Common.random(0,10000,1000);
		System.out.print("原始數據:");
		Common.printIntoTxt(array);
		sort(array1, 0, array1.length-1);;
		System.out.print("結果數據:");
		Common.printIntoTxt(array);
	}
	
	public static void sort(int[] array, int start, int end) {
		if(start+k < end){//已經遞歸到了最後 每個集合裏面自由一個元素
			int middle = (end+start)/2;
			sort(array, start, middle);
			sort(array, middle+1, end);
			merge(array, start, middle, end);
		}else{
			insert(array, start, end);
		}
	}
	/**
	 * 插入排序
	 * @param array
	 * @param end 
	 * @param start 
	 */
	public static void insert(int[] array, int start, int end){
		//從第二個開始 往上找下標比它小的數進行比較
		int size = end-start+1;
		for(int i=1; i<size; i++){
			for(int j=i-1; j>=0; j--){
				if(array[start+j+1]<array[start+j]){//找到了i的正確位置 爲j+1
					Common.swap(array, start+j+1, start+j);
				}
			}
			//Common.print(array);
		}
	}
	/**
	 * 將兩個數組合並
	 * @param array
	 * @param array2
	 * @return 是否成功合併
	 */
	private static Boolean merge(int[] array, int start, int middle, int end) {
		int size1 = middle - start + 1;//[start, middle]
		int size2 = end - middle;//(middle, end]
		int[] array1 = new int[size1];
		int[] array2 = new int[size2];
		int i=0, j=0, k=start;
		while(i<size1){//獲取到array數組左邊的值
			array1[i] = array[start+i];
			i++;
		}
		while(j<size2){//獲取到array數組右邊的值
			array2[j] = array[middle+1+j];
			j++;
		}
		i=j=0;
		while(i<size1 && j<size2){//將兩者中數據插入到新的數組中去
			if(array1[i]<array2[j]){
				array[k++] = array1[i];
				i++;
			}else{
				array[k++] = array2[j];
				j++;
			}
		}
		//收拾還剩餘的數據
		if(i<size1){
			while(i<size1){
				array[k++] = array1[i];
				i++;
			}
		}
		if(j<size2){
			while(j<size2){
				array[k++] = array2[j];
				j++;
			}
		}
		array1 = null;
		array2 = null;
		if(k == end+1){
			return true;
		}else{
			return false;
		}
	}	
}

 
 (四)內排序下界



 堆排序具體實現可以參考博客http://java--hhf.iteye.com/blog/2034925/

(ps:附件內附上工具類Common.zip)

發佈了30 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章