挑戰408 資料結構(9) 插入排序演算法

2021-09-28 23:26:00 字數 1587 閱讀 1822

還有幾種排序演算法,也表現出跟選擇排序演算法一樣的演算法複雜度o(n^2)。我們現在分析其中的一種,稱為插入排序演算法

插入排序的操作很簡單,跟選擇排序一樣,它需要遍歷所有的元素。但是與選擇排序不同,選擇排序是找到最小的數,然後與剩下的第乙個數交換位置。而插入排序則是遍歷所有元素,然後將剩餘的元素逐個按順序插入到已經排好序的vector中

再次考慮我們之前排序示例中使用的資料,下面**插入排序的演算法:

插入排序演算法的第乙個迴圈不需要工作,因為乙個元素的vector總是視為被排好了序:

在下乙個迴圈中,你需要將25放在正確的位置,因為56這個序列相當於是排好了序的,所以往這個序列裡面插,得到下圖:

在第三個迴圈,需要找到值37應該放**,前面的 25 56序列已經排好了,現在要將37插入進去。為了做到這一點,我們需要向前遍歷之前排好序的元素。當我們插入元素的時候,需要把每乙個較大的元素乙個位置向右移動,為要插入的數值騰出空間。 在本例中,56被向後移動了乙個位置,37上公升到在下標為1的地方。因此,第三個迴圈後的配置如下所示得到下圖:

重複1-3步驟,當遍歷完這個vector的時候,vector的順序就算是排好了。

插入排序的c++**

#include

#include

using

namespace std;

/*函式原型*/

void

sort

(vector<

int>

& vec)

;/*主函式*/

intmain()

sort

(vec)

;for

(int k =

0; k < vec.

size()

; k++

)return0;

}void

sort

(vector<

int>

&vec)

}}

執行結果如下:

現在我們可以來回答提出的兩個問題了,最好的情況是什麼呢?當然是已經排好序的時候啦。因為我們的操作是遍歷,然後比較大小再進行插入操作的。如果所有的資料都是後一位大於前一位,那麼說明的就是while迴圈根本都不用執行,因此我們所做的也就僅僅是遍歷的過程,也就是線性的複雜度o(n)。

現在我們再討論一下最壞的情況,是排序一組毫無規則的vector嗎?很明顯不是的,因為再沒有規則它前面都可以有比它小或者大的數,意味著它不用進行所有的插入操作了。最壞的情況我想應該就是讓你去用插入排序去將一組降序排列的vector變為公升序排序的vector了吧,就像 :

8 7 6 5 4 3 2 1

用插入排序排成:

1 2 3 4 5 6 7 8

每個操作都要移動n-1次。那麼我們進行了n次,所以顯然跟選擇排序的s演算法複雜度一樣為o(n^2) 。

資料結構 插入排序

演算法中經常會用到各種各樣的演算法,比較簡答的思想就是氣泡排序,一般剛開始程式設計時遇到排序問題時,會很容易想到冒泡排,氣泡排序是通過兩輛比較數值,從而將數字移動到開始或者末尾的位置,反覆重複這個過程從而就達到了排序的目的。其時間複雜度大概是 n2 還有一種比較常用的插入排序,其思想與氣泡排序比較類...

資料結構 插入排序

一 直接插入排序 1 直接插入排序的演算法思想 r i 的鍵值ki與r 0 r i 1 的鍵值依次比較 從後往前比 找到r i 應插入的位置,並把從該位置開始的記錄後移乙個位置,把r i 插入到找到的插入位置,完成一趟直接排序 重複選r i 1 r n 完成上述操作,直到排序完畢 注 為什麼要從後往...

資料結構 插入排序

插入排序的基本思想是 每步將乙個待排序的物件,按其關鍵字大小,插入到前面已經排好序的一組物件的適當位置上,直到物件全部插入為止。簡言之,邊插入邊排序,保證子串行中隨時都是排好序的。新元素插入到 在已形成的有序表中線性查詢,並在適當位置插入,把原來位置上的元素向後順移。關鍵字序列t 13,6,3,31...