希爾排序的介紹以及例子分析

2021-09-25 10:25:39 字數 2802 閱讀 6991

希爾排序是建立在插入排序基礎上的一種,減少增量的一種演算法(個人感覺就是減少分組)相對於單純的插入排序,其經過一次次分組排序,其穩定性相對比較好。同時希爾演算法在最壞的情況下和平均情況下執行效率相差不是很多。

個人理解:就是對n個數字分組,然後排序。假設有n個,那麼第乙個增量就是d=n/2,後面就是d=d/2,在各個組進行插入排序,最後d=1後,結束程式,排序結束。

(基礎定義網上百科官方一打一打,所以就不多言)

假設有n個(n=10個)亂序版的數字組成的陣列:69,56,12,136,3,55,46,99,88,25

如下圖

如上圖,d=10/2=5,在不超過長度的情況下每個元素的下標+5,組成一組,進行排序,比較大小。(就是分成5組比較大小,小的排前面,大的排後面)

排後結果如下圖

排完後,d=d/2=5/2=2(c語言整型,序列一般也不會有2.5。。。。)

相當於對其分成2組,然後排序。

對上述兩組內容進行排序,而不是兩個兩個比較,排序結果如下圖

然後d=d/2=2/2=1

所有資料都在一組,然後排序(由於前序操作基本上排的差不多了,基本上交換就在左右附近)

d=0,結束排序。

1.先賞析乙個思維比較簡單的,但是**相對而言粗糙一點的

#include"stdio.h"

void xier(int a,int n)

a[num]=m;}}

}} d=d/2; }}

void main()

; int i=0;

xier(a,10);

for(i=0;i<10;i++)

printf("\n");

}

結果

gec@ubuntu:/mnt/hgfs/share-2$ gcc eight.c -o eight

gec@ubuntu:/mnt/hgfs/share-2$ ./eight

3 12 25 46 55 56 69 88 99 136

賞析:相對而言這個**思維比較通俗點,首先是乙個while迴圈判決,什麼時候結束子程式,然後用乙個for迴圈,保證每次增量d變換後,每組都迴圈比較完成,然後用乙個for迴圈將各組內的數字進行排序,然後對組內的資料進行插入排序(首先針對組內元素乙個乙個排序,尋找應該插入的位置,然後插入,對其插入後原本有序的元素向後移)

總體就是:先判斷是否結束——>然後分組——>插入排序

2.接下來我們賞析乙個稍微稍微不尋常點的

#include int shsort(int s, int n)    /* 自定義函式 shsort()*/

{ int i,j,d;

d=n/2; /*確定固定增雖值*/

while(d>=1)

{for(i=d+1;i<=n;i++) /*陣列下標從d+1開始進行直接插入排序*/

{s[0]=s[i]; /*設定監視哨*/

j=i-d; /*確定要進行比較的元素的最右邊位置*/

while((j>0)&&(s[0]結果

gec@ubuntu:/mnt/hgfs/share-2$ gcc 1.c -o 1

gec@ubuntu:/mnt/hgfs/share-2$ ./1

請輸入 10 個資料:

1213

1416

172212

34排序後的順序是:

1 2 3 4 12 13 14 16 17 22

賞析:函式內也是乙個while迴圈控制子程式的結束,d的相關操作也和上乙個程式差不多,區別在於,乙個是他沒有利用int變數而是陣列的首元素作為交換的儲存,其次就是比較巧妙的 j=i-d; while((j>0)&&(s[0]d=2;

i=d+1=3

s[0]=s[3]

j=3-2=1

然後判斷是否需要交換,比較的僅僅只是s[1]和s[3],比較結束,j=1-2<0,結束迴圈比較,將s[0]的內容返還

i++——>i=4

j=4-2=2

然後判斷是否需要交換,比較的僅僅只是s[2]和s[4],比較結束,j=2-2<=0,結束迴圈比較,將s[0]的內容返還

i++——>i=5

j=4-2=3

然後判斷是否需要交換,比較的僅僅只是s[3]和s[5],比較結束,j=3-2>0,迴圈比較繼續,j=1

因為s[3]和s[5]已經比較結束,所以s[3]中是其中小的,而且第一次比較時s[3]是最大的,所以比較s[1]和s[3]可以比較出最小的。然後將s[0]的內容返還。

剩下的就一樣了。

謝謝**,僅代表個人觀點,歡迎留下不同意見!

希爾排序及其分析

希爾排序另一種叫法叫做縮減增量排序 演算法實現 public static void shellsort anytype a int j for int gap a.length 2 gap 0 gap 2 for int i gap ianytype tmp a i for j i j gap t...

希爾排序思想分析

這個圖可能一下子看不懂 現在來解釋一下 解釋 第一趟 第1個和第6個比較 排序 第2個和第7個比較,排序 第3個和第8個比較,排序 以此類推直到所有的都排好 第二趟 第1個 第3個 第5個 第7個 第9個 一起比較 排序 第2個 第4個 第6個 第8個 第10個 一起比較 排序 第三趟 都排序 優劣...

希爾排序的Java實現 效能分析以及適用場景

如下 package com.zm.testsort 希爾排序的最優化 author zm public class shellsort int d 1 while d n 3 while d 0 a j d temp d d 1 3 縮減間隔序列 public static void main s...