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

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


   上一篇文章提到了一些新的概念,不言而喻,概念的功能對人類來說是一項偉大的發現,百度對“概念”的定義是這樣的:概念具有兩個基本特徵,即概念的內涵和外延;概念的內涵就是指這個概念的含義,即該概念所反映的事物對象所特有的屬性。

     簡而言之,內循環,外循環,循環方向,循環節點這些概念能讓我們的大腦清晰清楚算法的作用過程和結果。

             插入排序同樣也有內循環和外循環,外循環的循環節點將已確定區域和待確定區域分隔開來,該節點屬於待確定區域(即待確定節點),循環方向由左向右(如圖所示),外循環的起點是第二個節點,循環終點是最後一個節點。內循環是子已確定區域進行的,方向是和外循環方向相反,循環起點是外循環節點的前一個節點,終點是第一個小於外循環節點的內循環節點,如圖所示。對於比較簡答易懂算法例子分析微博文章推薦給大家:以人的身高站隊的例子,下面我也借鑑了這位大神的微博圖片,請參考:

                                  

              內循環排序圖:


插入排序的時間複雜度是n的平方,同冒泡排序一樣,當數據一開始就已經排好序了時間複雜度就是0,當數據一開始就是倒序的,複雜度就是n*(n-1)/2,這兩種情況是一個最小,一個最大的兩種情況。這樣的情況和冒泡排序一樣

插入排序java實現(1)先查後插:

  	/*
	 * 插入排序(insert Sort)
	 * 時間複雜度爲O(n的平方) ,最好的情況是元素交換次數爲0,元素比較次數爲n-1。
	 * @param   sortOrder true表示增序,FALSE表示降序
	 * 第一種插入排序:先查移動元素節點,然後轉移元素集合,將查和移位分開處理,即:先查後插
	 */
	/*
	 * 我這個插入排序問題很大,時間複雜度稍微比真正的插入排序要多一點,多在了內循環:兩個並列的內循環
	 */
	public static void insertSort1(boolean sortOrder){
		
		int k ;
		
		for(int m = 1 ; m < array.length ; ++m)
			{
				int n;
				for(n = m - 1 ; n >= 0 ; --n)
					if((array[m] > array[n]&&sortOrder)||(array[m] < array[n]&&!sortOrder))
						break;
				int z ;
				k = array[m];
				for(z = m-1 ; z > n ;  --z)
					array[z+1] = array[z];
//				if(array[m]!=k)
					array[z+1] = k;
			}
	}
	

插入排序(2)邊查邊插:

	 * 插入排序(insert Sort)
	 * 時間複雜度爲O(n的平方) ,最好的情況是元素交換次數爲0,元素比較次數爲n-1。
	 * @param   sortOrder true表示增序,FALSE表示降序
	 * 第一種插入排序:這種插入排序沒有查找節點的步驟,只有比較移動元素步驟
	 * 這一種插入拍尋:插入排序改進,內循環只有一個,即邊查邊插
	 */
	
	public static void insertSort2(boolean sortOrder){
		
		int k;
		for(int m = 1 ; m < array.length ; ++ m)
		{
			int n ;
			k = array[m];
			for(n = m-1 ; n >= 0; --n)
				if((array[n] > k && sortOrder)||(array[n] < k && !sortOrder))
					array[n+1] = array[n];
				else break;
			array[n+1] = k;
		}
	}





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