希爾演算法筆記

2021-10-24 03:37:06 字數 2876 閱讀 7523

一、簡介和思想

希爾演算法:希爾排序是插入排序的一種又稱「縮小增量排序」,是簡單插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法,因 d.l.shell 於 1959 年提出而得名。

演算法的思想圖示例如有這麼個陣列

int

list =

;// 陣列長度為10

初始增量=陣列長度/2, gap=list.length/2,得到gap=5,那麼就將這個原始陣列分為5組(相同顏色用線連線的為一組)

得到這一組後、每一組的之間的元素進行比較、從小到大就小的放前面、大的放後面,然後得到。

繼續進行分組 gap=gap/2 得到gap=2.5,向下取整得gap=2,分組如下

排序後

繼續分組 gap=gap/2 得到 gap=1 。

再根據這一組進行排序得到如下

分步**實現(交換法)

第一次分組排序

int

list =

;int temp =0;

int num =1;

// 第一次排序

// gap = 5

int gap = list.length/2;

for(

int i = gap; i < list.length; i++)}

}for

(int i:list)

system.out.

println(""

);

第二次分步排序(在第一次分步的基礎之上)

gap = list.length/2/

2;//第二次排序

for(

int i = gap; i < list.length; i++)}

}for

(int i:list)

system.out.

println(""

);

第三次分步排序(在第一和二次分步的基礎之上)

gap = list.length/2/

2/2;

//第三次排序

for(

int i = gap; i < list.length; i++)}

}for

(int i:list)

system.out.

println(""

);

總結得到、兩個巢狀的for迴圈的內容都是一樣的只有gap發生變化得到

public

static

void

main

(string[

] args)

;int temp =0;

int num =1;

int gap = list.length/2;

while

(gap>0)

}}system.out.

println

("第"

+num++

+"次排序");

使用交換法這個**是老師的寫的, 個人還不能理解這段**的意思。

public

static

void

main

(string[

] args)

;int num =1;

for(

int gap = list.length/

2; gap >

0; gap/=2)

list[j]

= temp;}}

system.out.

println

("第"

+ num++

+"次排序");

演算法筆記 希爾排序

希爾排序是直接插入排序 的改進版,對於待排序序列的不同情況效率相近。1.演算法思想 先選取乙個小於n的增量d1,把序列中所有元素分成n d1個組,所有距離為d1的倍數的元素在同一組中,在各組內執行直接插入排序。然後選取乙個更小的增量d2,重複上述分組和排序過程 繼續減小增量,直至增量為1,即所有元素...

基礎演算法筆記四 希爾排序

希爾排序是對直接插入排序的改進,非穩定的排序演算法,使得該改進後的插入排序對非有序序列進行排序時所需時間減少,但是對於基本有序序列進行排序時時間有所增加,但是對於基本有序序列進行排序對比冒泡和選擇時間還是有優勢。基本思想 確定開始的增量,一般都是序列大小除以2。之後不斷除以2,縮減增量。根據增量對序...

希爾排序演算法

希爾排序演算法是對插入排序的一種改進,其核心是減少已排序區域的右移次數來提高速度。具體做法是先獲得乙個間隔數值 h,然後將 n 1 替換成 n h 來完成插入排序。具體例子 元素集合 2,9,5,1,8,3,6,4,7,0 間隔數值 h 4 第一次迴圈 當前元素 array 4 8,那麼 n h 4...