※主に自分の備忘のための記事です。
Javaによるシェルソートの実装例を以下に記載します。
初学者が自力で書いたので拙いです。今後改善する予定です。
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//数字の数を設定
int numberCount = Integer.parseInt(scanner.next());
//未整列の数字一覧を受け取る
int[] numbers = new int[numberCount];
for(int i = 0; i < numberCount; i++) {
numbers[i] = Integer.parseInt(scanner.next());
}
//シェルソートを行う際の間隔値を設定する・・・①
int intervalCount = Integer.parseInt(scanner.next());
int[] intervals = new int[intervalCount];
for(int i = 0; i < intervalCount; i++) {
intervals[i] = Integer.parseInt(scanner.next());
}
//①の間隔値に従いシェルソート実行
for(int i = 0; i < intervalCount; i++) {
for(int j = 0; j < intervals[i]; j++) {
if(j + intervals[i] > numberCount - 1) {
break;
}
for(int k = 0; k < (numberCount - j - 1) / intervals[i]; k++) {
for(int l = k + 1; l - 1 >= 0; l--) {
int former = j + intervals[i] * (l - 1);
int later = j + intervals[i] * l;
if(numbers[former] > numbers[later]) {
int tempNum = numbers[former];
numbers[former] = numbers[later];
numbers[later] = tempNum;
//↓ここ大事!既に並び替えが完了している場合にスキップを行っている
} else {
break;
}
}
}
}
}
for(int num : numbers) {
System.out.println(num);
}
}