插入排序演算法及其分析

2021-06-21 10:10:11 字數 1411 閱讀 9435

直接插入排序

1.插入排序思想

直接插入排序思想是將待排序的陣列看作兩個部分:有序部分和無序部分,排序過程就是不斷將無序部分的元素插入到有序部分合適的位置上,使有序部分元素不斷增加而無序部分資料不斷減少,直到陣列全部有序為止。

假設陣列a[0...n-1]

(1)初始時,a[0]作為有序部分,a[1...n-1]為無序部分;

(2)在有序部分進行比較和移動,為無序部分的第乙個元素a[1]找到合適的位置,並插入到有序部分,使a[0,1]構成新的有序部分,而a[2...n-1]為剩下的無序部分;

(3)按照步驟(2)執行,直到陣列有序。

2.插入排序的實現

根據上述的演算法思想描述,可以得到實現**(c++實現)如下。

void insertsort_direct(int arr, int len)

arr[j+1] = elemsort;

}}

3.插入排序的優化

由插入排序的特點可知,在陣列有序部分進行比較和查詢待排元素的合適位置時,除了簡單的由右向左的順序遍歷外,在通常情況下可以採用效率更高的二分查詢方法找到該位置,此時查詢的時間複雜度降低。但是需要注意的是:雖然比較和查詢時間複雜度降低,但是每次需要移動的元素個數與順序比較和查詢是相同的。實現**(c++實現)如下。

void insertsort_binary(int arr, int len)

else

}for (j = i-1; j>=low; j--)

arr[low] = elemsort;

}}

還可以使用鍊錶實現直接插入排序,留給讀者思考和實現。

4.插入排序的效能

時間複雜度:直接插入排序的最好情況是待排序列已經是公升序排列了,在這種情況下,每次只需要進行一次比較操作(一共需要n-1次),不需要移動元素操作,此時時間複雜度為o(n)。而最壞情況是待排序列是降序排列的,此時每次需要進行i次比較和i次移動,i從1到n-1,所以一共需要n(n-1)/2次,此時時間複雜度為o(n^2)。平均來說插入排序演算法複雜度為o(n^2)。

空間複雜度:僅需要乙個輔助變數,所以為o(1);

穩定性:穩定的就地排序(穩定性還需要**設計來保證);

使用場合:插入排序不適合對於資料量比較大的排序應用。但是,如果需要排序的資料量很小,例如,量級小於千,那麼插入排序還是乙個不錯的選擇,而且,如果待排資料已經是基本有序的,那麼插入排序將是乙個絕佳的選擇(為什麼?見時間複雜度分析)。 插入排序在工業級庫中也有著廣泛的應用,在stl的sort演算法和stdlib的qsort演算法中,都將插入排序作為快速排序的補充,用於少量元素的排序(通常為8個或以下)。

插入排序及其優化

插入排序 把乙個無序的陣列分為兩部分,一部分為有序 剛開始只有乙個元素 一部分為無序 從第二個元素開始 將無序元素乙個乙個插入到有序元素中。void insertsort int arr,size t size arr j x 直接插入排序耗時的操作有 比較 後移賦值。時間複雜度如下 1 最好情況 ...

插入排序及其優化

複雜度o n 2 用筆模擬過程可輕鬆得出 一 思路 index 0 1 2 3 4 5 value 4 3 2 6 4 8 1 選定起始指標index 0,此時已排好順序的子陣列長度為1 就是list 0 4 2 指標後移,候選元素變為list 1 3,將該元素不斷向左交換到某個位置,使得list ...

插入排序及其優化

插入排序 直接插入排序 時間複雜度為o n 2 穩定的排序元素移動是順序的 在乙個陣列中,將第乙個元素看作排序元素序列裡的唯一元素,然後用臨時變數tmp首先存放第二元素,即可在陣列中空第二個元素位置 即此位置可被覆蓋 將第二個元素與有序序列裡面唯一乙個元素進行比較,根據排序條件決定元素是否需要向後移...