插入排序的效果就像將乙個陣列模擬成兩個陣列的在選擇、插入的過程。
假設在下標 i 之前的是數都已經排好了順序( 0 … i-1 ),那麼此次需要找到 i 位置的數的正確位置 k 。在尋找這個位置 k 的過程中,逐個比較 i 之前排好順序的陣列,先比較最大的 i-1 位置的數(因為有序,所以 i 以前的數, i-1 是最大的),在尋找的過程中,比較的數大於當前 i 位置的數 ,那麼比較的數置後乙個位置,那麼在有序陣列中會一直「騰位置」,那麼一直一直找,當找到比 i 位置小的數時,插入到這個數的後面即可,完成一趟插入。
上面說的很麻煩,直接看走位比較好 t t 。
初始陣列:[ 11 , 31 , 12 , 5 , 34 , 30 , 26 , 38 , 36 , 18 ]
第一趟:[ 11 , 31 , 12 , 5 , 34 , 30 , 26 , 38 , 36 , 18 ] ( 無移動的元素 )
第二趟:[ 11 , 12 , 31 , 5 , 34 , 30 , 26 , 38 , 36 , 18 ] ( 31 向後移動 )
第三趟:[ 5 , 11 , 12 , 31 , 34 , 30 , 26 , 38 , 36 , 18 ] ( 11 , 12 , 31 皆向後移動 )
第四趟:[ 5 , 11 , 12 , 31 , 34 , 30 , 26 , 38 , 36 , 18 ] ( 無移動的元素 )
第五趟:[ 5 , 11 , 12 , 30 , 31 , 34 , 26 , 38 , 36 , 18 ] ( 31 , 34 向後移動 )
第六趟:[ 5 , 11 , 12 , 26 , 30 , 31 , 34 , 38 , 36 , 18 ] ( 30 , 31 , 34 向後移動 )
第七趟:[ 5 , 11 , 12 , 26 , 30 , 31 , 34 , 38 , 36 , 18 ] ( 無移動的元素 )
第八趟:[ 5 , 11 , 12 , 26 , 30 , 31 , 34 , 36 , 38 , 18 ] ( 38 向後移動 )
第九趟:[ 5 , 11 , 12 , 18 , 26 , 30 , 31 , 34 , 36 , 38 ] ( 26 , 30 , 31, 34 , 36 , 38 向後移動 )
總結:插入排序會比選擇排序更優秀,以為它能利用排序過程中部分數有序的優勢,減少一些不必要的比較,是否優秀取決於陣列的初始順序。
如果給定的陣列是倒序,那麼就是最壞的情況下了,比較次數:1 + 2 + … ( n-1 ) + n = ( n+1 ) / 2。是乙個不穩定的排序,依賴著陣列的初始順序。
public
> t insertsorting(t array)
/*** 如果一直沒找到j的位置 那麼就是 選擇到的元素一直比較小
* 那麼一直騰位置
*/array[j] = array[j - 1];
}//如果此時 j = 0 說明了 順序序列裡沒有比選擇元素小的
array[j] = toinsert;
system.out.print("i = " + i + " array = ");
for (t data : array)
system.out.println("");
}return array;
}
public
static
void
main(string args) ;
integer result = insertsort.insertsorting(object);
system.out.println("");
system.out.println("\n插入排序\n");
for (int i : result)
system.out.println("");
system.out.println("\n插入排序\n");
}
4 插入排序
插入排序是把序列的第乙個值當做是有序的序列,把餘下的序列按照排序規則 公升序還是降序 插入到該序列中,當遍歷至序列尾部後,則形成有序序列。例如 6 5 4 3 2 把6當做是有序序列,把餘下的序列 5,4,3,2 按照公升序插入到有序序列 6 中。第一趟結果 5 6 4 3 2 有序序列為 5,6 ...
4 插入排序
插入排序 insertion sort 的演算法描述是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。一般來說,插入排序都採用in place在陣列上實現。具體演算法描述如下 1.從第乙個元素開始,該元素可以認為已經被排序 2...
插入排序演算法(4)
目錄 插入排序演算法原理 插入排序演算法的使用場景 插入排序演算法的實現 插入排序演算法的執行結果 在插入排序中,需要將取出的資料與其左邊的數字進行比較。就跟前面講的步驟一樣,如果左邊的數字更小,就不需要繼續比較,本輪操作到此結束,自然也不需要交換數字的位置。然而,如果取出的數字比左邊已歸位的數字都...