插入排序的種類及實現

2021-10-09 20:08:21 字數 2905 閱讀 3621

基本思想是從第乙個數開始,從後面每插入乙個數就與前面的已有的數進行比較,一般情況下從小到大排序。

#

include

#include

#define

tint

#define

max_size

20typedef t sqlist[max_size]

;void

insertsort1

(sqlist &l,

int n)}}

void

main()

;//第乙個數字0不做排序處理

int n =8;

for(

int i =

1; i < n; i++

)printf

("%d "

, l[i]);

insertsort1

(l, n)

;printf

("\n排序之後\n");

for(

int i =

1; i < n; i++

)printf

("%d "

, l[i]);

}

模擬**過程:第乙個for迴圈開始,第乙個數字49,i=1,不滿足if條件。

第二個數字38,i=2,滿足if(38<49),temp賦值當前數38,進入第二個for迴圈:

for(j=1; j>0&& l[j]>temp) l[2]=l[1]=49 ; 之後j–,跳出for迴圈後j=0,l[0]=temp=38,完成38的插入。

第 三個 數字65,i=3,不滿足if條件。

第四個數字97,i=4,不滿足if條件。

第五個數字76,i=5,滿足if(76<97),temp賦值當前數76,進入第二個for迴圈:

j從當前數的前驅開始(即97),依次向前走, for(j=4; j>0&& l[j]>temp) l[5]=l[4]=76

不滿足 for(j=3; j>0&& l[j]>temp)跳出迴圈,此時j=3, 所以l[4]=temp=76,完成76的插入。

到此,記憶體的數字排列應是0,38,49,65,76,97,13,27。

13和27插入過程也是如此,這裡就不做分析了。

下面的**也是直接插入排序,只是包裝了乙個swap交換函式,看起來就顯得比較簡潔,而且用不到第一位l[0]=0,,其實本質還是一樣。

void

swap

(t *a, t *b)

void

insertsort

(sqlist &l,

int n)}}

}

前插存在的問題:如果是存在一組數38,49,再插入乙個65,65要先插入到38的後面,再與49比較插入到49的後面,這就增加了比較和移動的次數。

基本思想是:把陣列的第一位l[0](也就是新插入元素)當做哨兵,當新插入元素小於它的前一位元素時,用作新插入元素與前面其他已經排好序的元素之間做比較;當新插入元素大於它的前一位元素,不做比較。

如何進行比較並移動位置呢?

讓l[0](新插入元素都會賦值給l[0])依次與新插入元素的前一位元素 (l[j]) 進行比較,l[0]void

insertsort

(sqlist &l,

int n)

l[j +1]

= l[0]

;}}}先用折半查詢找到元素應該插入的位置,在移動元素。雖然減少了比較的次數,但移動元素的次數沒變。

void

binsertsort

(sqlist &l,

int n)

for(

int j = i; j > high +1;

--j)

//找到插入的位置,後面的數後移一位

l[high +1]

= l[0]

;//將當前數插入

}}

模擬**過程如下: 元素是49,38,65,97,76,13,27

i=2時,l[0]=l[i]=38,low=high=1,可以進入while,

第1次while,mid=1,if (l[0] >= l[mid])不成立,high=1-1=0查詢左邊部分

第2次while,while(low<=high)不成立,退出while,接下來就是移動元素了。

i=3時,l[0]=l[i]=65,low=1,high=2,可以進入while,

第1次while,mid=1,if (l[0] >= l[mid])成立,low=1+1=2

第2次while,mid=2,if (l[0] >= l[mid])成立,low=2+1=3

第2次while,while(low<=high)不成立,退出while,但不滿足for迴圈,故無需移動,賦值即可。

它的工作原理是比較相隔一定距離的元素,並且每趟比較所用的距離隨演算法進行而減小,因此,希爾排序也叫做縮減增量排序。對於大規模的亂序陣列插入排序很慢,因為它只會交換相鄰元素,因此只能一點點地挪到相應位置,遇到極端情況如最小元素剛好在陣列的最右端,那它要經過n-1次移動才能到正確位置,希爾排序為了加快速度,採用交換不相鄰元素的方法對陣列的一部分進行排序,先令不同間隔的陣列變成有序狀態,最後再用一次直接插入排序完成排序。

void

shellinsert

(sqlist &l,

int n,

int dk)

//dk代表增量

l[j+dk]

= l[0]

;}}}

void

shellsort

(sqlist &l,

int n,

int dlta,

int t)

}

其他的插入排序還有2路-插入排序、表排序,但都不常用。

插入排序及java實現

一 插入排序演算法 介紹 插入排序的原理是對每個未排序資料,在已排序資料中從後往前掃瞄,找到相應位置並插入 步驟 1.從第乙個元素開始,認為第乙個元素已經排好序 2.取出下乙個元素,在已經排好序的元素中從後往前掃瞄 3.如果掃瞄資料 已排序 大於新資料,將該元素後移 4.如果掃瞄資料 已排序 小於等...

插入排序實現

插入排序 public class insertionsort for int i arr 思路 外層迴圈用來從無序區域中取值,起始位置是下標1,把下標0到下標0當作已經有序的區域,把要取的值用臨時變數val存起來,如果這個值正好應該排在有序區域的最後,那麼插入位置就是它原來的下標,如果這個值比有序...

折半插入排序及PHP實現

直接插入排序演算法是利用有序表的插入操作來實現對資料集合的排序。在進行第p 1趟的插入排序時,需要在前面的有序序列data 0 data 1 data p 中找到 data p 1 的對應的位置i,同時將data i data i 1 data p 都向後移動乙個位置。由於有序序列式排好序的,故可以...