簡單排序算法時間空間複雜度分析及應用(4)-二分插入排序

    簡單排序算法時間空間複雜度分析及應用(4)-二分插入排序      

 

背景:

顧名思義,這個二分插入排序是直接插入排序的進化版,主要變化的地方就是在內循環部分,即外循環的循環節點在確定區域的位置查詢方式由原來的直接循環 比較變爲二分法的方式來查詢,在這確定區域數據都是已經排好序了的。 

                分析:

這種插入排序屬於插入排序中的先確定插入位置,後進行插入操作,因此在內循環中有兩個同級別的循環體。

                 

代碼實現:

	/*
	 * 二分法插入排序(binary insert Sort)
	 * 時間複雜度爲O(n的平方) ,最好的情況是元素交換次數爲0,元素比較次數爲n-1。
	 * @param   sortOrder true表示增序,FALSE表示降序
	 * 第一種插入排序:這種插入排序有查找節點的步驟,採用的是二分法查詢,這種查詢方式只能在確定區域使用
	 * 這一種插入排序:插入排序改進,同級別的內循環有兩個,第一個是獲取插入位置,第二個是移動確定區域元素
	 */
	
	public static void insertSortBinary(boolean sortOrder){
		
		int k ;
		
		for(int m = 1 ; m < array.length ; ++m)
			{
				
//				for(n = m - 1 ; n >= 0 ; --n)
//					if((array[m] > array[n]&&sortOrder)||(array[m] < array[n]&&!sortOrder))
//						break;
				/*
				 * 二分法查詢
				 */
				int p , q , mid;
				p = 0 ;//確定區域起點
				q = m-1;//確定區域終點
				//錯誤點:我本來設計的就是可以相等,卻沒在這個不等式中表現出來!
				while(p <= q)
				{
					mid = (p+q)/2;
					if((array[mid] < array[m]&&sortOrder)||(array[mid] > array[m]&&!sortOrder))
					{
						p = mid + 1;
					}
					else 
					{
						q = mid - 1;
					}
				}
				int z ;
				k = array[m];
				for(z = m-1 ; z > p - 1 ;  --z)
					array[z+1] = array[z];
//				if(array[m]!=k)
					array[z+1] = k;
			}
	}

使用場景:

二分法插入排序和之前的一種直接插入排序幾乎一樣,只是這個插入排序中的插入位置查詢模塊使用了二分法查詢,這種插入排序適用於n數據量大且無序的情況,這樣會大大減少查詢的時間,從而爲整個插入排序節省時間,但是當大部分數據塊都是已排序的,使用二分法就不如直接插入排序來得好。

         圖文解析:

這屬於插入排序的一種,圖文分析和之前的插入排序都一樣,可參考之前的插入排序圖文分析。

         


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