1. 程式人生 > >8大排序之-----(一)插入排序與時間複雜度

8大排序之-----(一)插入排序與時間複雜度

  (一)什麼是插入排序呢?

           插入排序就是每次把待排序的資料一個數據插入到已經排好序的正確位置。就好比,你左手拿著撲克牌,用右手去取牌的時候,把取到的牌放到左手正確的位置。

比如我們要排序4,3,5,7,6,2,1,9,88,0。

(1)我們先假設下標為0的資料是排好的,即4是排好序的

那麼接下來就要3,5,7,6,2,1,88,0.中每次取出一位放到陣列的正確位置。


(2)取3的時候,3< 4,所以3放到4的前面


(3)取5的時候,5>4,所以放到4後面


(4)取7的時候,7>5,所以7放到5後面


(5)取6的時候,5<6<7,所以6放到7的前面,5的後面



(6)取2的時候,2比(7,6,5,4,3)都小,所以放到3前面



(7)取1的時候,1比(7,6,5,4,3,2)都小,所以放到2前面



以此類推,剩下的兩個就不畫圖了

(二)程式碼如下

public class ChaRu {
	
	public static void main(String args[]) {
		
		int a [] = {4,3,5,7,6,2,1,9,88,0};
		sort(a);
		 System.out.print("結果為"+ a[0]+","+a[1]+","+a[2]+","+a[3]+","+a[4]+","+a[5]+","+a[6]+","+a[7]+","+a[8]+","+a[9]);
	}
	
	public static void sort(int s []){
		int start = 1;//index = 0 的預設排好了的。
		
		//i代表初始吭位置 - 趟數
		for(int i = start; i<s.length; i++){//設定陣列的第一個元素是排序好的
			int j = i;
			int temp = s[i];//把s[i]賦給中間變數,相當於把s[i]挖空,等找到合適的元素再把元素插入這個位置
			
			while(j > 0 && s[j-1] > temp){// r如果元素比中間值大,則移動位置
				      s[j] = s[j-1];
				      j--;//不斷和排好序的元素比較, 此時的坑index
			}
			
			s[j] = temp;//每次迴圈後把坑填好
		}
	
     //System.out.print("結果為"+ s);
}
	}

(三)現在來分析一下插入排序的時間複雜度:

在最壞情況下,陣列完全逆序,插入第2個元素時要考察前1個元素,插入第3個元素時,要考慮前2個元素,……,插入第N個元素,要考慮前 N - 1 個元素。因此,最壞情況下的比較次數是 1 + 2 + 3 + ... + (N - 1),等差數列求和,結果為 N^2 / 2,所以最壞情況下的複雜度為 O(N^2)。


最好情況下,陣列已經是有序的,每插入一個元素,只需要考查前一個元素,因此最好情況下,插入排序的時間複雜度為O(N)