插入排序(insertion sort)是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上,通常採用in-place排序(即只需用到o(1)的額外空間的排序),因為在從後向前掃瞄過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。
* 插入
** @param array
*/private static void insertionsort(int array)
array[index] = insertval;//放置insertval}}
最好的情況:正序有序(從小到大),這樣只需要比較 n 次,不需要移動。因此時間複雜度為\(o(n)\)。
最壞的情況:逆序有序,這樣每乙個元素就需要比較 n 次,共有 n 個元素,因此實際複雜度為 \(o(n^2)\)。
平均情況:\(o(n^2)\)。
空間複雜度:\(o(1)\)。
如果碰見乙個和插入元素相等的,那麼插入元素把想插入的元素放在相等元素的後面。所以,相等元素的前後順序沒有改變,從原無序序列出去的順序就是排好序後的順序,所以插入排序是穩定的。
排序演算法
平均時間複雜度
最好情況
最壞情況
空間複雜度
穩定性插入排序
\(o(n^2)\)
\(o(n)\)
\(o(n^2)\)
\(o(1)\)
穩定二分(折半)插入排序是一種在直接插入排序演算法上進行改動的排序演算法。其與直接排序演算法最大的區別在於查詢插入位置時使用的是二分查詢的方式,在速度上有一定提公升。
/**
* 插入優化(二分法)
** @param array
*/private static void insertionsort_2(int array) else
}//將前面所有大於當前待插入元素的元素後移
for (int j = i - 1; j >= left; j--)
//將待插入元素插入到正確位置
array[left] = insertval;}}
插入每個元素需要\(o(log n)\)次比較,最多移動 i+1 次,最少 2 次。
最好情況時間複雜度為\(o(n log n)\),最壞和平均情況時間複雜度為\(o(n^2)\)。
二分搜尋比順序搜尋查詢快,所以二分插入排序就平均效能來說比直接插入排序要快。
當n較大時,總排序碼比較次數比直接插入排序的最壞情況要好得多,但比其最好情況要差。
在物件的初始排列已經按排序碼排好序或接近有序時,直接插入排序比折半插入排序執行的排序碼比較次數要少。折半插入排序的物件移動次數與直接插入排序相同,依賴於物件的初始排列。
二分插入排序是乙個穩定的排序方法。
posted @
2018-03-26 23:52
武培軒 閱讀(
...)
編輯收藏
排序演算法 插入排序
插入排序 insertion sort 的演算法描述是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上,通常採用in place排序 即只需用到o 1 的額外空間的排序 因而在從後向前掃瞄過程中,需要反覆把已排...
排序演算法 插入排序
排序演算法之插入排序 參照新版程式 下面是錯誤的理解,正確的參考,後文已經修改過的部分。選擇排序,顧名思義,就是選擇乙個元素進行排序。原理 將原始序列分成兩部分,一部分已經有序,一部分無序。將無序中的元素逐個插入到有序序列中。這個也是兩層迴圈,就我個人理解,與氣泡排序是乙個原理。氣泡排序是每次都從無...
排序演算法 插入排序
插入排序簡單來說 就是將乙個資料插入到已經到排好的序列中,但要求插入後仍然有序。這種方法一般適用少量資料的。一 主要的插入排序 直接插入排序 二分插入排序 鍊錶插入排序,希爾排序,是屬於穩定排序的一種。二 直接插入排序 把n個待排序的元素看成為乙個有序表和乙個無序表,開始時有序表中只包含乙個元素,無...