Java排序演算法之希爾排序

2021-08-06 04:27:07 字數 1718 閱讀 2184

希爾排序(shell sort)又稱為「縮小增量排序」。是2023年由d.l.shell提出來的。它也是一種屬於插入排序類的排序方法,是一種對直接插入排序的改進,但在時間效率上卻有較大的改進。

希爾排序的基本思想是:先將整個待排元素序列分割成若干個子串行(由相隔某個「增量」的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。

通俗來講是首先將待排序的元素分為多個子串行,使得每個子串行的元素個數相對較少,對各個子串行分別進行直接插入排序,待整個待排序序列「基本有序」後,再對所有元素進行一次直接插入排序。

因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率上比直接插入方法有較大提高。

取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同乙個組中。先在各組內進行直接插人排序;然後,取第二個增量d2 < d1重複上述的分組和排序,直至所取的增量dt=1(dtpackage com.algorithm.sorting;

/** * 希爾排序

* *@author administrator

* */

public

class

shellsort

system.out.println("");

int temp = 0;

int incre = array.length;

while (true) else }}

system.out.print("第" + (k + 1) + "次排序結果:");

for (int a = 0; a < array.length; a++)

system.out.println("");

}if (incre == 1)

}system.out.print("最終排序結果:");

for (int a = 0; a < array.length; a++)

}public

static

void

main(string args) ;

shell_sort(array);

}}原始碼結果

要排序的陣列:100  99  53  -1  33  20  

第1次排序結果:-1 99 53 100 33 20 ①

第2次排序結果:-1 33 53 100 99 20 ②

第3次排序結果:-1 33 20 100 99 53 ③

第1次排序結果:-1 20 33 53 99 100 ④

最終排序結果:-1 20 33 53 99 100

從排序結果中可以看出,增量分子為3,將陣列分為兩部份,a[0]與a[3],a[1]與a[4],a[2]與a[5]進行增量插入排序,如①②③;最後再對所有元素進行一次直接插入排序如④。

空間效率:僅使用乙個輔存單元。

時間效率:從對直接插入排序的分析中知道,雖然直接插入排序的時間複雜度為o(n 2 ),但是在待排序元素序列有序時,其時間複雜度可提高至o(n)。由此可知在待排序元素基本有序時,直接插入排序的效率可以大大提高。從另一方面看,由於直接插入排序方法簡單,則在n值較小時效率也較高。希爾排序正是從這兩點出發,對直接插入排序進行改進而得到的一種排序方法。

JAVA排序演算法之希爾排序

本章內容對希爾德原理及特點並沒有做太多敘述,主要目的是對希爾排序 進行 解希爾排序內容簡介希爾排序是插入排序的一種,也成縮小增量排序,是直接插入排序演算法的 一種更高效的改進版本 希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入演算法排序,每組包含的元素越來越多,當增量減至1.整個陣列恰被分...

排序演算法之希爾排序 java

希爾排序是基於插入排序而改進的排序方法。它將資料分為多組,再對各組使用插入排序。分組依據是增量d,一般增量是 排序元素的長度 2,呼叫一次插入排序,再繼續除2,再呼叫一次插入排序,再d 2.直到d 1 希爾排序的時間複雜度為 o n平方 思路 如有下列10個帶排序元素 增增量d 10 2 5,即每隔...

排序演算法之希爾排序 java實現

希爾排序 在直接插入排序的基礎上進行的優化,直接插入排序在n值小的時候效率比較高,在n很大的時候如果待排序序列基本有序,效率依然很高,時間效率可以提公升為o n 希爾排序也稱之為縮小增量排序。1.先選取乙個小於n的整數d 步長 然後按照步長d將待排序序列分為d組,從第乙個記錄開始間隔為d的為乙個組。...