算法排序----插入排序法

接下來我來說述一下插入排序法。java

首先來解釋一下插入排序法的原理,它的原理是每插入一個數都要將它和以前的已經完成排序的序列進行從新排序,也就是要找到新插入的數對應原序列中的位置。那麼也就是說,每次插入一個數都要對原來排序好的那部分序列進行從新的排序,時間複雜度一樣爲O(n²)。 這種算法是穩定的排序方法。算法

下面我用一個圖來解釋一下數組

首先這是一個未經排序的數組3d


咱們要作的從a[1]開始,至於爲何不是a[0]。a[0]以前沒有與a[0]進行比較的元素。咱們插入a[1],這個時候咱們須要遍歷a[1]和a[1]以前的全部元素進行比較。這個時候咱們須要設置一個變量j,用來記錄第一個 比 a[1]元素小的那個元素的下標,也就是a[1]要插入的位置,這個時候跳出循環,而且每發現一個比a[1]大的元素,就要令這個元素後移一位。依次類推的算法直到整個數組的最後一個。code

以a[4]爲例,假設a[3]  (注意,這個地方,從a[0]到a[3]已經完成了排序)小於 a[4] ,那麼就j的值是 3blog

那麼這個時候 a[4] 就應該放在 下標是3+1 = 4的位置處排序


下面我來展現一下個人代碼並對代碼進行具體的解釋。class

/**
	 * 插入排序法<br>
	 * <font color="red">時間複雜度: n²</font>
	 * @param array
	 * @return
	 */
public int[] insertSort(int[] array){
	
	//直接插入排序
			//在排序以前咱們須要搞清一個思路,新插入一個數據的時候,排序事後的數組都是
			//從小到大排列好的,因此咱們須要從後往前查找,直到找到比咱們要插入的數字還小的
			//值。這個時候咱們須要一個變量j做爲標識
			for(int i = 1;i<array.length;i++){
				int temp = array[i];
				int j;
				for(j = i-1;j>=0;j--){
					//將大於temp的數向後移動一步
					if(array[j]>temp){
						array[j+1] = array[j];//記錄j的值也就是temp要插入的位置
					}else{
						break;
					}
				}
				array[j+1] = temp;
			}
			
		
	return array;
}

咱們能夠看到,這個數組我是從 array[1] 開始的 。令temp 等於 array[i]。 將 i以前的全部元素和它對比。注意是倒序對比。由於實際上,每找到一個比array[i]大的元素 就要讓它向後移動一位,空出一個位置,最後空出的位置就是temp 應該在的位置。變量

舉個例子,a[5] 在排序中,假設 a[4] 比 a[5] 大,那麼原先數組的 a[5] 值就要變成 a[4] 了 。這個時候 j 是 4.原理


那麼若是這個時候a[3] 比 a[5] 小呢,那麼循環就要跳出。j的值是3


那麼這個temp的值應該放在哪裏呢,很明顯應該是 a[4]纔對啊。

這就是插入排序法,它和冒泡排序法同樣,適合於全部的狀況。可是缺點就是時間消耗會很是大。