資料結構_排序_直接插入排序+希爾排序
其實主要是為了講述希爾排序,不過插入排序是希爾排序的基礎,因此先來講直接插入排序。
一、直接插入排序
1、原理
下標tmp
假設陣列為a,i為當前元素下標,則a[i]為當前元素的值
從下標i=2開始迴圈,與自己之前的元素比較大小(預設自己之前的序列已經是有序(公升序))
a[i] > a[i-1],則不需要和i-2,i-3...等比較了,因為i-1已經是前面這些元素中最大的了
a[i] < a[i-1],那就迴圈繼續和i-2,i-3...比較,直到a[i] > a[i-?]的時候,跳出迴圈
所有這些操作,其實都是在乙個陣列中進行位置的交換,下面來看看**:
直接插入排序時間複雜度為o(n^2),在 資料基本有序+記錄數較少 的情況下會有較好的表現
二、優化 直接插入排序 至 希爾排序
當年d.l.shell(希爾排序的發明者)苦想怎麼才能讓待排序的資料基本有序+記錄數少,結果腦洞大開,決定把資料多次(分組+組內插入排序),那這樣每次分組就是實現記錄數少的目標,多次分組那就可以慢慢實現整個資料集基本有序
結果弄著弄著就給整出乙個時間複雜度更低的排序演算法,嘿嘿~
1、多次分組=>基本有序?如何實現?很重要!
看到上圖,相信各位就能體會那句「多次分組就可以慢慢實現整個資料集基本有序」了!
請思考!如果就分組一次,那組內有序後,還要組與組之間有序,否則不能做到整個資料集基本有序!!(所以應該多次跳躍式分組)
三、希爾排序
「增量」到底設定成多少?到目前為止,貌似沒有什麼特別好的辦法,各位就先採用已經有的**的模式吧
希爾排序python 簡書 JS實現希爾排序
希爾排序本質上是一種插入排序,但是對數列進行了等間隔分組處理,在每一組中做插入排序,這一優化使得原本 o n 2 的時間複雜度一下降為 o nlogn 基本思想 希爾排序是按一定的間隔對數列進行分組,然後在每乙個分組中做插入排序 隨後逐次縮小間隔,在每乙個分組中做插入排序.直到間隔等於1,做一次插入...
希爾排序python 簡書 入門演算法 希爾排序
上手難度 演算法複雜度 o n 1.3 2 shell.gif 排序思想 最開始以整個陣列長度的一半作為步長gap進行分組 例如8個元素,索引0和索引4一組,索引1和索引5一組,索引2和索引6一組,索引3和索引7一組,分別對分好的組使用插入排序進行排序,這樣就得到了4個已經排好序的四組資料,再對步長...
Python 希爾排序
coding utf 8 希爾排序 def shellsort list list 4,1,9,13,34,26,10,7,4,3 m len list 元素數目 gap m 2 gap 5,2,1.while gap 0 print gap 列表中的list i 按間隔gap從列表中取元素list...