まず、nよりも小さい整数D1を最初の増分として撮影し、ファイル内のすべてのレコードをD1のグループに分割します。距離dlの倍数のあるすべてのレコードは、同じグループに配置されます。まず、各グループに並べ替えを直接挿入します。2番目の増分D2 <D1を取り、インクリメントdt = 1(dt <dt-l <;…<d2 <d1)まで上記の並べ替えを繰り返します。すべてのレコードは同じグループに配置され、直接ソートされます。
この方法は、基本的にグループ化挿入方法です。
回路:
ソースコード
コードコピーは次のとおりです。
パッケージcom.zc.manythread;
/**
*
* @author私は
*
*/
パブリッククラスのshellsort {
public static int count = 0;
public static void shellsort(int [] data){
//最大H値を計算します
int h = 1;
while(h <= data.length / 3){
H = H * 3 + 1;
}
while(h> 0){
for(int i = h; i <data.length; i += h){
if(data [i] <data [i -h]){
int tmp = data [i];
int j = i -h;
while(j> = 0 && data [j]> tmp){
data [j + h] = data [j];
j- = h;
}
データ[j + h] = tmp;
print(data);
}
}
//次のH値を計算します
h =(h -1) / 3;
}
}
public static void print(int [] data){
for(int i = 0; i <data.length; i ++){
System.out.print(data [i] + "/t");
}
System.out.println();
}
public static void main(string [] args){
int [] data = new int [] {4、3、6、2、1、9、5、8、7};
print(data);
Shellsort(data);
print(data);
}
}
実行結果:
シェルの並べ替えは不安定で、そのスペースオーバーヘッドもO(1)であり、時間オーバーヘッドはO(N3/2)とO(N7/6)の間であると推定されます。