排序演算法之插入排序

2021-08-01 23:28:41 字數 1681 閱讀 8494

排序演算法是演算法導論一書中首先介紹的內容,由它引出了如何證明演算法是正確的(迴圈不變式),也引出了演算法複雜度的計算。

對插入排序而言,它的工作方式就像我們在打牌時排序一手撲克牌一樣。我們每次摸到一張牌後都會把這張牌與我們手裡的牌進行對比,然後將它放在正確的位置。

我們以這樣一組數為例(演算法導論書中的課後題 ),來說明插入排序具體的執行過程。

c++**:

#includeusing namespace std;

void insertionsort(int* arr, int len) cout << endl;

} }}void insertionsortte(int* arr, int len)

arr[j+1] = temp; }}

int main() ;

//insertionsort(arr, 5);

insertionsortte(arr, 6);

for (int m = 0; m < 6; m++)

}

主體函式是insrectionsortte,函式insertionsort是為了說明其每一步的過程有怎樣的輸出,其輸出如下

也可以看出其操作原理。

接下來我們來分析一下**,並證明該**確實可以實現對一組數的非降序排序。

要想證明該演算法的正確性,我們需要引入迴圈不變式的概念:1.初始化:即迴圈的開始前滿足所有要求。2.保持:第n次迴圈都滿足我們的要求。3.終止:迴圈結束符合我們的目的。

對於上面插入排序的函式inserctionsortte**:

for (int i = 1; i < len; i++) 

arr[j+1] = temp;

}

仍以排序一手撲克牌為例:在迴圈沒有開始時,我們只拿到了一張撲克牌,它是排好序的,顯然符合我們的要求;第n次迴圈時,假設前n-1次迴圈滿足我們要求(即前面所有的撲克已經排好序),我們先建立乙個臨時變數temp儲存拿來的撲克牌的值,然後用乙個迴圈讓它和前面已經排好序的撲克牌進行對比,如果temp更小,將temp向前移動否則 結束迴圈,顯然這樣操作後也就把撲克牌排好序了。這樣保持性也得到了證明。於是排序演算法就得到了證明。看似沒有價值,但這種思想對程式設計是很重要的。

接下來,我們來看一下經常看到的時間複雜度的問題。我們先來考慮最好的情況:假設說我們的撲克牌已經排好序了,我們依然用這種方法操作,在執行過程中將一直不滿足內層迴圈的條件(temp

我們再來考慮最壞的情況:假設每次內層迴圈的條件每次都得到滿足(顯然這就是最壞的情況),那麼假設內層迴圈一次的時間是n』,迴圈次數顯然是len的乙個二次函式;

最短和最長的執行時間我們都知道了以後我們想用乙個統一的識別符號來表示這樣演算法的乙個執行時間,我們用

θ(n平方

)表示,(關於演算法的漸進符號簡單了解一下即可)。

至此,插入排序演算法就介紹完了,我們肯定會去思考有沒有更加高效的排序演算法呢?

來來來~喝完這杯還有一杯

排序演算法之插入排序

排序演算法之插入排序 1 插入排序的思想 假設在乙個有序序列中 e 0 e i 1 這i 個元素已經排好序,則當要將第 i 1個元素 e 插入該序列時,只需將第 i 1個元素與從 e 0 開始到e i 1 元素進行比較,當發現第 j個元素 e j 在序列中應在 e 前,且 e j 1 應在e 後時,...

排序演算法之插入排序

排序演算法之插入排序 1 插入排序的思想 假設在乙個有序序列中 e 0 e i 1 這i 個元素已經排好序,則當要將第 i 1個元素 e 插入該序列時,只需將第 i 1個元素與從 e 0 開始到e i 1 元素進行比較,當發現第 j個元素 e j 在序列中應在 e 前,且 e j 1 應在e 後時,...

排序演算法之插入排序

本節主要分析插入排序演算法的直接插入排序和希爾 shell 排序 又稱縮小增量排序 1.直接插入排序 該排序是最簡單的排序方法,其基本思想是 假設待排序的記錄存放在陣列r 1.n 中。初始時,r 1 自成1個有序區,無序區為r 2.n 從i 2起直至i n為止,依次將r i 插入當前的有序區r 1....