希尔排序
increment为每次相隔的距离,此过程是中间过程,可以把外循环改一下就变成希尔排序
希尔排序就是有递减间隔的插入排序
import java.util.Scanner;
public class shellTest {
public static void main(String[] args) {
Scanner inScanner=new Scanner(System.in);
int n=Integer.parseInt(inScanner.nextLine());
for(int a=0;a<n;a++){
String[] nums=inScanner.nextLine().split(" ");
String[] increment=inScanner.nextLine().split(" ");
int[] nums1=new int[nums.length];
for(int i=0;i<nums.length;i++){
nums1[i]=Integer.parseInt(nums[i]);
}
int[] increment1=new int[increment.length];
for(int i=0;i<increment.length;i++){
increment1[i]=Integer.parseInt(increment[i]);
shellSort(nums1,increment1[i]);
}
print(nums1);
}
/*int [] a={49,38,65,97,76,13,27,49,55,4};
shellSort(a, 5);
shellSort(a, 3);
print(a);*/
}
private static void shellSort(int[] nums1, int increment) {
// TODO Auto-generated method stub
for(int i=increment;i<nums1.length;i++){
//等于多一道隔increment循环,反而增加了复杂度,不如直接一个一个遍历
//for(int j=i+increment;j<nums1.length;j+=increment){
int temp=nums1[i],index=i;
while(index-increment>=0&&temp<nums1[index-increment]){
nums1[index]=nums1[index-increment];
index=index-increment;
}
nums1[index]=temp;
//}
}
}
//按格式打印
private static void print(int[] a) {
// TODO Auto-generated method stub
if(a.length==1)
System.out.print(a[0]);
else {
System.out.print(a[0]);
for(int i=1;i<a.length;i++){
System.out.print(" "+a[i]);
}
}
System.out.println();
}
}