排序演算法 插入排序的時間複雜度分析

2021-09-26 09:41:42 字數 1432 閱讀 9610

插入排序的原理是,將陣列分為已排序區間和未排序區間兩部分,從未排序區間中依次取元素跟已排序區間的元素一一對比,找到適合插入的位置。

拿陣列[4,5,6,1,3,2]來舉例,如圖所示是排序的**過程。這個過程比上邊的原理詳細的多,本以為可以按照原理來寫出插入排序的**,嘗試了幾次發現原理的資訊量並不足以寫出來。這裡邊最難理解的就是當已排序區間元素發現比未排序區間元素大的時候,已排序區間的元素會往後移動一位,然後已排序區間待比較元素繼續往前移動進行比較,如果發現比未排序區間元素還大,繼續往後移動一位,最終若已排序區間的元素是乙個比未排序區間的元素小停止比較,把這個未排序區間元素賦值給那個已排序區間相對比較是小的元素的下一位。

怎麼樣?是不是被我繞暈了。結合下邊這個圖和**思考一下吧!

我覺得還是要回歸到資料結構本身,這裡使用的是陣列的排序,使用到比較和移動,比較比較簡單,所以關鍵在於如何移動?

很遺憾,這裡把整個處理搞明白之後才理解到這一層,那就是根據資料結構本身的特點,思考如何操作,比如陣列就思考如何移動才能滿足演算法的需要(比如這裡的插入排序)

對於任何資料結構和演算法的學習,要充分理解資料結構本身的特點以及熟練資料結構的各種操作(比較、移動方式等)。

這裡也就是沒充分理解插入排序演算法中資料的移動原理。

插入排序**:

/**

* 插入排序,a 表示陣列,n 表示陣列大小

* @param n

*/public static void insertionsort(int a, int n)

for (int i = 1; i < n; ++i) else

}// 插入資料

a[j+1] = value;}}

所謂原地排序演算法,就是空間複雜度為o(1)的演算法,那麼上邊的演算法不牽涉額外得到其他空間。所以是原地排序演算法。

所謂穩定,指的是當陣列**現相同數值元素的時候,排序是否會造成相同數值元素相對位置的改變。可以看出在插入排序演算法中,對於相同數值的元素可以選擇插入到已排序區間等值元素的後邊,所以相同數值元素的相對位置不會發生改變,因此插入排序演算法是穩定的排序演算法。

在完全有序的情況下,插入排序每個未排序區間元素只需要比較1次,所以時間複雜度是o(n)。而在極端情況完全逆序,時間複雜度為o(n^2).就等於每次都把未排序元素插入到陣列第一位。在陣列中插入1個元素的時間複雜度為o(n),那插入n個就是o(n^2)了。(對於乙個給定的初始序列,移動操作的次數總是固定的,就等於逆序度。)

其實插入排序的移動操作比氣泡排序簡單很多,插入排序需要乙個賦值操作,冒泡要三個,如果較真點看首選還是插入排序,因為插入排序不但移動操作簡單,而且優化空間還很大。這篇這個只是基本的一種。

插入排序演算法 時間複雜度

1.插入排序演算法 void sortt int a,int length 插入排序演算法 a j 1 temp 2.演算法的時間複雜度 我們假設計算機執行一行基礎 需要執行一次運算。int afunc void 那麼上面這個方法需要執行 2 次運算 int afunc int n for int ...

氣泡排序 選擇排序 插入排序演算法及時間複雜度詳解

流程 把0到n個元素中的最大值放在n位置 把0到n 1個元素中的最大值放在n 1位置 把0到n 2個元素中的最大值放在n 2位置 時間複雜度 嚴格的o n2 的演算法 即使資料已經排好序,還要全部按照程式流程比較 交換一遍,所以稱為嚴格o n2 氣泡排序演算法 defbubbling sort ls...

插入排序演算法 時間複雜度和穩定性

排序的思想就是維護乙個有序的部分,將無序部分的資料按照順序插入到有序部分。通俗的講,插入排序的原理就是 先將最後乙個元素作為有序部分,前面元素作為無序部分,將倒數第二個元素和最後乙個元素比較,如果倒數第二個元素大於最後乙個元素,則將倒數第二個元素查到最後乙個元素的位置。此時無序部分是第乙個元素到倒數...