插入排序包括:直接插入排序,折半插入排序,希爾排序~!
ok,下面我們就來逐個講解!
一、直接插入排序
直接插入排序屬於穩定的排序,時間複雜性為o(n^2),空間複雜度為o(1)。二、折半插入排序它的基本思想是:
假設待排序資料存放在陣列a[1..n]中,則a[1]可看作是乙個有序序列,讓i從2開始,依次將a[i]插入到有序序列a[1..i-1]中,a[n]插入完畢則整個過程結束,a[1..n]成為有序序列。
ok,現在我們來看一下排序的過程:
待排序資料: 【25】 54 8 54 21 1 97 2 73 15 (n=10)
i=2: 【25 54
】 8 54 21 1 97 2 73 15
i=3: 【
8 25 54】 54 21 1 97 2 73 15
i=4: 【8 25 54 54
】 21 1 97 2 73 15
i=5: 【8 21 25 54 54】 1 97 2 73 15
i=6: 【
1 8 21 25 54 54】 97 2 73 15
i=7: 【1 8 21 25 54 54 97
】 2 73 15
i=8: 【1 2 8 21 25 54 54 97】 73 15
i=9: 【1 2 8 21 25 54 54 73 97】 15
i=10: 【1 2 8 15 21 25 54 54 73 97】
排序結束
可在陣列中增加元素a[0]作為關鍵值儲存器和迴圈控制開關。第i趟排序,即a[i]的插入過程為:
① 儲存a[i]→a[0]
③ 如果a[j]<=a[0](即待排序的a[i]),則a[0]→a[j+1],完成插入;
否則,將a[j]後移乙個位置:a[j]→a[j+1];;繼續執行③
對於上面的資料例項,i從2依次變化到10的過程中,j值分別為
來看一下動畫演示:直接插入排序動畫演示
ok,下面來看一下**,本**是c語言!
[cpp]view plain
copy
void
insert_sort(
inta,
intn)
a[j + 1] = temp;
} }
ok,現在我們來看一下c++版本的**:(本**取自維基百科)
[cpp]view plain
copy
#include
template
<
typename
biiter>
void
insertion_sort(biiter begin, biiter end)
*ins = key;
} }
折半插入排序演算法是一種穩定三、希爾排序的排序演算法,時間複雜度仍然為o(n^2)!!!
本排序是在直接插入排序的基礎上,減少了比較和移動的次數形成的!是對插入排序演算法的一種改進!
具體操作:
在將乙個新元素插入已排好序的陣列的過程中,尋找插入點時,將待插入區域的首元素設定為a[low],末元素設定為a[high],則輪比較時將待插入元素與a[m],其中m=(low+high)/2相比較,如果比參考元素小,則選擇a[low]到a[m-1]為新的插入區域(即high=m-1),否則選擇a[m+1]到a[high]為新的插入區域(即low=m+1),如此直至low<=high不成立,即將此位置之後所有元素後移一位,並將新元素插入a[high+1]。
ok,我們來看一下**! 這類似於二分法查詢,相信大家都不陌生!
[cpp]view plain
copy
void
binary_insert_sort(
inta,
intn)
//開始移動元素
for(
intj = i; j > low; j--)
a[low] = temp;
} }
該演算法也是對直接插入排序的一種改進!也叫做遞減增量排序演算法!該演算法的效能提公升至o(
nlog2n
)!他的最優時間是線性時間!
演算法基本思想:
取乙個小於n的整數s1作為增量,把所有元素分成s1個組。所有間距為s1的元素放在同乙個組中。第一組:
第二組:
第三組:
第s1組:
先在各組內進行直接插人排序;然後,取第二個增量s2(1)重複上述的分組和排序,直至所取的增量st=1(st
t-1t-2
<…2
1),即所有記錄放在同一組中進行直接插入排序為止。
序號原始資料
5757
s1=5
組別排序結果
57
57
s2=3
組別排序結果
57
57
s3=2
組別排序結果
57
57
s4=1
組別排序結果
57
57
ok,通過上表可以看的清楚是如何排序的,有可能有的童鞋還是不清楚,那沒事,我現在上傳乙個短動畫,通過動畫我相信你能夠很好的理解shell排序!
希爾排序動畫演示
ok,我們現在來看**吧!
[cpp]view plain
copy
void
shell_sort(
inta,
intn)
//還是直接插入
for(;i > 0;)
a[m + i] = temp;
} i = (i - 1) / 4;
} }
ok,再來看一段c++**,來自維基百科!
[cpp]view plain
copy
template
<
typename
t>
void
sort(std::vector& v)
} **:jofranks 部落格
Tuple Swift 技術成長筆記 新浪部落格
元組 元組中的元素可以是值,也可以是區間。另外,使用下劃線 來匹配所有可能的值。let tup 88,eqi dds var ss tup.0 var tup2 name mac age 88,dds var name tup2.0 或者 var name1 tup2.name 分解 var tp ...
Objective c類別 技術成長筆記 新浪部落格
類別 類別要解決的問題是 為現有的類增加新行為 子類是一種辦法,但是面對類簇和工具包或類庫時確無能為力 類別解決了這個問題 12.1 建立類別 類別是一種為現有類提供新方法的方式 12.1.1 宣告類別 inte ce nsstring numberconvenience nsnumber leng...
iOS推送 實現本地推送 技術成長筆記 新浪部落格
第一步 建立本地推送 建立乙個本地推送 uilocalnotification notification uilocalnotification alloc init autorelease 設定10秒之後 nsdate pushdate nsdate datewithtimeintervalsin...