插入排序的過程和平時打牌的時候給手裡的牌排序差不多:
從牌桌上抽一張牌
把抽到的牌從右到左(或者從左到右)挨個和手裡的牌進行比較,當發現左邊的牌大一些,右邊的牌小一些,就將牌插入到該位置
重複執行步驟1,直到牌抽完了
#include #include /**
* 對範圍[first, last)的元素進行插入排序
* @param first 雙向迭代器開頭
* @param last 雙向迭代器結尾
* @param comp 比較函式
*/templatevoid insertionsort(bidirectionaliterator first, bidirectionaliterator last, compare comp) else
*next = std::move(val);}}
}}
對於排序演算法而言,它並不會關心自己處理的資料具體代表什麼,而只關心資料之間的大小關係。所以對於任意一組資料,都可以將裡面的元素抽象成其在整組資料裡面的大小排名(rank)。簡單起見,這裡假設所有元素大小均不相同,於是任一組資料便可對應於集合\(\pi=\\)的一種排列。
然後引入逆序對(invertion pair)的概念:
定義:在數列\(a[1\ldots n]\)中若存在下標\(1\leq i使得 a[i]>a[j] ,則稱\((a[i],a[j])\)為乙個逆序對。數列中逆序對的總數為逆序數
顯然陣列的逆序數能很好地描述該陣列的無序程度。而且不難看出的是一組資料的逆序數剛好就是插入排序需要執行的比較移動操縱的次數。因為在進行元素的插入時,每一次比較出元素該再往前一步時,隨著較大的元素後移一步恰好就修復了乙個逆序對。
期望值\(e(x)\)求解過程:
令隨機變數
\[x_= \begin 1, & \text \\ 0, & \text \end \]則
\[x=\sum^{}_}
\]\[e(x)=\sum^{}_)}
\]很明顯\((a[i],a[j])\)是逆序對的概率是\(\frac\),所以期望也是\(\frac\)
\[e(x)=\sum^{}_}=\frac
\]
排序演算法(1) 插入排序
輸入 n個數的乙個序列 a1,a2 an 輸出 輸入序列的乙個排序 a1,a2,an 滿足a1 a2 an。首先,對於少量元素的排序,插入排序是一種有效的演算法。舉個生動的例子,插入排序就像我們手裡剛剛分到的撲克牌,亂序。我們會將排由左到右進行整理,由小到大排序。待排序列 5 4 3 9 7 5 3...
排序演算法1 插入排序
插入排序思想 每一步將乙個待排序的元素,按期排序碼的大小,插入到前面已經排好序的一組元素的合適位置上去,知道元素插完。插入排序分為直接插入排序,和優化後的二分插入排序,我們先看第一種 基本思想 當我們插入第i i 1 個元素時,前面的所有元素已經排好序,此時我們使用當前元素從後向前比較,直到找到乙個...
演算法(1)插入排序
最近在看 演算法導論 想著將其中涉及到的演算法都實現一遍,這是第一篇,也是剛剛開始。插入排序的演算法大致是這樣的,好比打牌,將桌上的牌在手上實現排序。1.從桌上拿一張牌 2.從後向前與手中的牌面大小進行比較。若相比更小,則說明還沒有到插入的位置,手上的此牌右移一位。3.若相比大,則插入到此牌的前一張...