直接插入排序的理解(來自維基百科)
一般來說,插入排序都採用in-place在陣列上實現。具體演算法描述如下:
從第乙個元素開始,該元素可以認為已經被排序
取出下乙個元素,在已經排序的元素序列中從後向前掃瞄
如果該元素(已排序)大於新元素,將該元素移到下一位置
重複步驟3,直到找到已排序的元素小於或者等於新元素的位置
將新元素插入到該位置後
重複步驟2~5
平均時間複雜度o(n^2)
最優時間複雜度o(n)
最差時間複雜度o(n^2)
希爾排序:
原始的演算法實現在最壞的情況下需要進行o(n
2)的比較和交換。v. pratt的書[1]
對演算法進行了少量修改,可以使得效能提公升至o(n log2
n)。這比最好的比較演算法的o(n log n)要差一些。
希爾排序通過將比較的全部元素分為幾個區域來提公升插入排序的效能。這樣可以讓乙個元素可以一次性地朝最終位置前進一大步。然後演算法再取越來越小的步長進行排序,演算法的最後一步就是普通的插入排序,但是到了這步,需排序的資料幾乎是已排好的了(此時插入排序較快)。
假設有乙個很小的資料在乙個已按公升序排好序的陣列的末端。如果用複雜度為o(n
2)的排序(氣泡排序或插入排序),可能會進行n次的比較和交換才能將該資料移至正確位置。而希爾排序會用較大的步長移動資料,所以小資料只需進行少數比較和交換即可到正確位置。
乙個更好理解的希爾排序實現:將陣列列在乙個表中並對列排序(用插入排序)。重複這過程,不過每次用更長的列來進行。最後整個表就只有一列了。將陣列轉換至表是為了更好地理解這演算法,演算法本身僅僅對原陣列進行排序(通過增加索引的步長,例如是用i += step_size
而不是i++
)。
1 插入排序
本來是想對插入排序做乙個詳細的說明 從演算法原理 演算法優劣 演算法實現一一說起。但是要將演算法原理說的通俗易懂,不是個簡單的事情,常常需要很好的文筆和配上詳細的圖。但是最近需要複習準備面試,確實沒什麼時間去寫一系列完整地說明演算法的部落格,所以這次就只是寫下演算法實現 c 的細節和詳細注釋,找到新...
1 插入排序
一種增量式的做法 在處理少量資料元素進行排序的有效演算法。由內外兩層for迴圈構成,內迴圈做比較,外迴圈控制哪個是插入值。排序引數是乙個陣列 a 1 n 包含n個待排序數 a j 先放入key變數中。將陣列邏輯劃分為 手牌區 a 1 j 1 key區域 a j 和 待插入區 a j 1 n 開始時手...
排序1 插入排序
讓我們開始排序的學習吧,首先我們先理解一下插入排序的基本思想 每一趟將乙個待排序的記錄,按其關鍵字的大小插入到已經排好序的一組記錄的適當位置上,知道所有待排序記錄全部插入為止。這個可能會和選擇排相似,但是那個是設定最大或最小,然後依次找到最大或最小插入到特定位置,而選擇依次比較後移或前移,不要混淆哦...