shell排序可以理解為插入排序的變種,它充分利用了插入排序的兩個特點:
(1). 當資料規模小的時候非常高效。
(2). 當給定資料已經有序時的時間代價為o(n)
所以,shell排序每次把資料分成若干塊,來使用插入排序,而且之後在這若干個小塊排好序的情況下把它們合成大一點的小塊,繼續使用插入排序,不停的合併小塊,知道最後乙個塊,並使用插入排序。
這裡每次分成若干小塊是通過「增量」來控制的,開始時增量較大,接近n/2,從而使得分割出來接近n/2個小塊,逐漸的減小「增量」最終到減小到1.
一直較好的增量序列是2^k-1,2^(k-1)-1,.....7,3,1,這樣可使shell排序時間複雜度達到o(n^1.5),所以在實現shell排序的時候採用該增量序列
public
abstract
classsorterextendscomparable>
protected
final
voidswap(e array,intfrom ,intto)
public
voidsort(string hellostring,intfrom,intlen) }
public
classshellsorterextendscomparable>extendssorter;
shellsorters1 =newshellsorter();
for(inti=0;i<6;i++)
s1.sort(mystringarray1, 0, 6); }
@override
public
voidsort(e array,intfrom,intlen)
for(intdelta=value;delta>=1;delta=(delta+1)/2-1)}}
private
final
voidmodify_insert_sort(e array,intfrom,intlen,intdelta)else
array[j]=tmp;}}
}}
希爾(shell)排序原理分析及Java實現
shell排序 先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同乙個組中。先在各組內進行直接插入排序 然後,取第二個增量d2 public class demo system.out.print n public static void main...
Java 排序實現
set extends collection list extends collection 因此可以對 set 集合或者 list 集合使用 collections.sort 方法排序。public class user implements comparable list list new ar...
java排序之shell排序 希爾排序 (四)
shell排序是一種相對我之前寫的冒泡,選擇,插入排序更加高效的排序演算法 它的基層排序思想還是用的插入排序的思想,但加入了縮小增量的思想 流程如下 1 將n個元素的陣列分成n 2個序列,第1個資料與第n 2 1個資料為一對,第2個資料與第n 2 2個資料為一對.2 一次迴圈使每乙個序列對排好序。3...