插入排序(希爾排序)

2021-08-20 08:50:53 字數 895 閱讀 4856

一.直接插入排序

在希爾排序之前,我們先來看一下比較簡單的直接插入排序。其演算法思想主要是,將乙個無序的資料插入到已經排好序的有序表中,從而得到乙個資料量+1的有序表。以此類推,便可將所有資料變為有序。

這種思想在生活中十分常見,比如你有一堆無序的作業,你會看一下第二份作業的序號,然後與第乙份作業的序號相比,如果大於,則第二份放在最上面,否則位置不動。在這個過程中,第乙份作業就是乙個有序表(乙個資料必定有序),然後操作完成後,你便得到了有2個資料的有序表。接下來,第3個,第4個.....直到全部有序。

時間複雜度:o(n^2),需要乙個資料的輔助空間。

**:

for(int i=2;i=i) continue;//無需插入

for(int k=i-1;k>=j;k--)

data[k+1]=data[k];//後移

data[j]=data[0];//插入

}

二.希爾排序

希爾排序又稱「縮小增量排序」,時間效率會高很多。話不多說,先看**。

void insertsort(int data)//希爾排序

{ printf("希爾排序:\n");

//生成隨機數並輸出

for(int i=1;i=1)

{for(i=1;i0)

{if(data[j+d]剛開始是生成隨機數,就不用多說了。然後取增量d,增量的取法多種多樣,不同的取法適合不同型別的問題,我們這裡採用比較常見的折半取增量,d最後一次一定為1(最後一次直接插入排序一趟)。其他的看注釋也就差不多了,本質上還是插入排序,只不過是隔幾個資料排序。

三.其他插入排序

其他的插入排序方法也有很多,都不怎麼常用,如:2路,表插等,有時間再寫寫吧。

ps:希爾排序的時間複雜度不一定是n^2,要看增量取法。

插入排序 希爾插入排序

本文借鑑於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 ...