插入排序演算法 二

2021-09-12 10:40:47 字數 3214 閱讀 6683

插入排序是一種常見的排序演算法,它主要包括直接插入,折半插入和希爾(shell)排序(直接插入排序的改進)等。一組有序陣列需要新增乙個新的資料後,如何保持仍然有序,則最簡單就是遍歷陣列,找到資料應該插入的位置將其插入即可。

直接插入:

首先,我們將陣列分為待排序和已排序兩個區間,初始化已排序區間只有乙個元素,就是陣列中的第乙個元素。插入排序演算法的核心思想是取待排序區間中的元素,在已排序區間中找合適的插入位置將其插入,並保證已排序區間資料一直有序。重複這個過程,直到未排序區間中元素為空,演算法結束。

一般插入排序都採用在陣列上實現。具體演算法描述如下:

a.從第乙個元素開始,該元素可以認為已經被排序;

b.取出下乙個元素,在已排序的元素序列中從後向前掃瞄;

c.如果該元素(已排序)大於新元素 ,將該元素移動到下乙個位置;

d.重複以上操作c,直到找到已排序的元素小於或者等於新元素的位置;

e.將新元素插入到該位置後;

f.重複步驟b到e

public

static

void

insort

(int

data)

else

else

} data[j+1]

=value;}}

}

直接插入排序還是氣泡排序好

時間複雜度相同,都是原地排序演算法,但是氣泡排序不管怎末優化,元素交換的次數是乙個固定值。插入排序是同樣的。但是,從**實現上看,氣泡排序的資料交換要被插入的資料移動複雜,氣泡排序需要3個賦值操作,而插入排序只需要乙個。雖然時間複雜度相同,但是插入排序有很大的優化空間,下面就是對插入排序的優化。

折半插入排序:

折半插入排序,是對插入排序演算法的改進。排序思想:有⼀組資料待排序,排序區間data[0]~data[n-1]

將資料分為有序資料和⽆序資料,第⼀次排序時預設data[0]為有序資料,data[1]~data[n-1]為⽆序資料。有序資料分割槽的第⼀個元素位置為left,最後⼀個元素的位置為right。

遍歷⽆序區間的所有元素,每次取⽆序區間的第⼀個元素data[i],因為0~i-1是有序排列的,所以⽤中

點mid將其平分為兩部分,然後將待排序資料同中間位置為mid的資料進⾏⽐較。

若待排序資料較⼤,則left–mid-1分割槽的資料都⽐待排序資料⼩,反之,若待排序資料較⼩,則mid+1–right分割槽的資料都⽐待排序資料⼤,此時將left或right重新定義為新的合適分割槽的邊界,對新的⼩分割槽重複上⾯操作。直到left和right 的前後順序改變,此時right+1所處位置為待排序資料的合適位置。

public

static

void

binaryinsort

(int

data)

else

else

}//要插入的位置在right+1處,搬移元素

int j=i-1;

for(

;j>right;j--

) data[j+1]

=value;}}

}

陣列近乎有序時:直接插入排序優於折半插入排序

陣列元素倒序時:折半插入排序優於直接差插入排序

希爾排序:

希爾排序是第⼀個突破o(n^2)的排序演算法,是簡單插⼊排序的改進版。它與插⼊排序的不同之

處在於,它會優先⽐較距離較遠的元素。希爾排序⼜叫縮⼩增量排序。

希爾(shell)排序⼜稱縮⼩增量排序,是對直接插⼊排序的優化。

先將整個待排序的記錄序列分割成為若⼲⼦序列分別進⾏直接插⼊排序,具體演算法描述:

選擇⼀個增量序列t1,t2,…,tk,其中ti>tj,tk=1;

按增量序列個數k,對序列進⾏k 趟排序;

每趟排序,根據對應的增量ti,將待排序列分割成若⼲⻓度為m 的⼦序列,分別對各⼦表進⾏直接插⼊排序。僅增量因⼦為1 時,整個序列作為⼀個表來處理,表⻓度即為整個序列的⻓度。

public

static

void

shellsort

(int

data)

else

else

} data[j+step]

=value;

} step=step/2;}}}

測試**:

package data.sort;

public

class

insort

;insort

(arr)

;arrprint

(arr)

;binaryinsort

(arr)

;arrprint

(arr)

;shellsort

(arr)

;arrprint

(arr);}

public

static

void

arrprint

(int

data)

}}

當數列在近乎有序時,插入排序時間複雜度能達到o(n)的時間複雜度,當數列本身很短,且有序時,插入排序演算法的效能特別高。

三種排序演算法的比較

方式---------------------時間複雜度-------空間複雜度----------穩定性

直接插入排序--------- o(n^2) --------------- o(1) ------------------ 穩定

折半插入排序--------- o(n^2)------------------ o(1)----------------- 穩定

希爾排序---------------- 不容易計算 ------------o(1) --------------- 不穩定

排序演算法 二 插入排序

繼上篇 排序演算法 一 基礎篇 這篇部落格咱們聊聊插入排序 經常用的插入排序方法有直接插入排序,折半插入排序,表插入排序和希爾排序。這篇部落格咱們重點說一下直接插入排序 直接插入排序 straight insertion sorting 它是一種簡單的排序方法。基本思想 依次將每個記錄插入到乙個已經...

排序演算法 二 插入排序

概念 把陣列分成兩部分,一部分是有順序的,第二部分是沒有順序的,從沒有順序的陣列中拿出來乙個,把他排在有序陣列中的相應位置 時間複雜度最好 o n 原陣列已經是公升序的。最壞 o n 平均 o n 插入演算法 function insert sort arr else arr j 1 value v...

演算法 排序演算法(二) 插入排序

本篇博文旨在介紹排序演算法中的插入排序 介紹了直接插入排序和希爾排序,並通過時間複雜度和空間複雜度進行了分析 最後用 實現了直接插入排序和希爾排序 1 將陣列分成有序和無序的兩塊區間,有序區間開始只劃分陣列的第乙個元素 2 從無序區間的第乙個數,找到合適的位置插入到有序的陣列中 在最好的情況下,已經...