Description
实现Shell排序,对给定的无序数组,按照给定的间隔变化(间隔大小即同组数字index的差),打印排序结果,注意不一定是最终排序结果!
Input
输入第一行表示测试用例个数,后面为测试用例,每一个用例有两行,第一行为给定数组,第二行为指定间隔,每一个间隔用空格隔开。
Output
输出的每一行为一个用例对应的指定排序结果。
Sample Input 1
1
49 38 65 97 76 13 27 49 55 4
5 3
Sample Output 1
13 4 49 38 27 49 55 65 97 76
package org.alphacat.first;
import java.util.Scanner;
public class ShellSort {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while (scan.hasNext()) {
int caseCount = scan.nextInt();
scan.nextLine();
for (int i = 0; i < caseCount; i++) {
String input = scan.nextLine();
String[] temp = input.split(" ");
int[] arr = new int[temp.length];
for (int j = 0; j < arr.length; j++) {
arr[j] = Integer.parseInt(temp[j]);
}
String stepString = scan.nextLine();
String[] stepStrings = stepString.split(" ");
int[] step = new int[stepStrings.length];
for (int j = 0; j < stepStrings.length; j++) {
step[j] = Integer.parseInt(stepStrings[j]);
}
ShellSort(arr, step);
println(arr);
}
}
}
private static void ShellSort(int[] arr, int[] step) {
for (int i = 0; i < step.length; i++) {
InsertSort(arr, step[i]);
}
}
private static void InsertSort(int[] nums, int step) {
for (int i = step; i < nums.length; i++) {
int temp = nums[i];
int j;
for (j = i - step; j >= 0; j -= step) {
if (temp < nums[j]) {
nums[j + step] = nums[j];
} else {
break;
}
}
nums[j + step] = temp;
}
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
private static void print(int[] arr) {
StringBuilder sb = getStringBuilder(arr);
System.out.print(sb.toString());
}
private static void println(int[] arr) {
StringBuilder sb = getStringBuilder(arr);
System.out.println(sb.toString());
}
private static StringBuilder getStringBuilder(int[] arr) {
int n = arr.length;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
sb.append(arr[i]);
if (i != n - 1) {
sb.append(" ");
}
}
return sb;
}
}