排序 插入排序,希爾排序

2021-08-20 02:28:37 字數 1161 閱讀 6267

基本思想:每一步將乙個待排序的元素,按其排序碼的大小,插入到前面已經排好序的序列的合適位置上,直到元素全部插入完畢。

直接插入排序:

空間複雜度:o(1)

時間複雜度:o(n*n)

穩定性:穩定

使用場景:對於一組有序的序列,想插入乙個資料。

插入排序的優化:使用二分查詢找到合適的插入位置(折半插入排序)

void insertsort_op(int *arr, int size)

int j = i;

while (j>left && arr[j-1]>tmp)

arr[left] = tmp;}}

我們與直接插入的方法比較,可以看出,直接插入法,沒插入乙個元素,都要依次與有序元素序列每乙個元素比較,最差的情況要比較n次,所以要排序n個元素,時間複雜度為o(n*n).而折半插入排序,每次先用折半查詢到有序序列中的合適的位置,需要比較log以2為底的n次。找到合適位置後再移動有序序列中元素。

時間複雜度:最差的情況o(n*n)

最好的情況o(lgn)

空間複雜度:o(1)

穩定性:穩定

在大規模資料中,折半查詢比直接插入排序要快。

希爾排序:將待排序的序列分成若干個子串行(由某一分量相隔的元素組成),分別對若干個子串行進行直接插入排序,之後依次縮小分量直到整個序列基本有序,再對整個序列進行直接插入排序,基於插入排序在基本有序的序列中效率極高,因此可以提高直接插入排序的效率。

時間複雜度:o(n*lgn) (lgn為 log以2為底的n)

空間複雜度:o(1)

穩定性:不穩定

插入排序 希爾插入排序

本文借鑑於lsgo實驗室創始人馬老師 演算法 希爾插入排序 delta len nums 2 while delta 0 shell delta,nums delta delta 2return nums defshell delta,key for i in range delta,len key...

插入排序 希爾排序

我們知道當乙個序列基本有序時,直接插入會變得很高效。因為此時只需少量的移動元素,操作集中在元素的比較上。基於這種想法,我們就試圖把乙個序列在進行直接插入前調整得盡量有序。這就是希爾排序 shell sort 的核心思路。shell只是演算法發明者的名字,無特殊含義 那到底該怎麼做呢?希爾排序一反以前...

插入排序 希爾排序

希爾排序 先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄 基本有序 時,再對全體記錄進行依次直接插入排序。以n 10的乙個陣列49,38,65,97,26,13,27,49,55,4為例 第一次 gap 10 2 5 4938 6597 2613 2749554 ...