希尔排序基本思想
设待排元素序列有n个元素,首先取一个整数d(d小于n)作为间隔,将全部元素分为d个子序列,所有距离为d的元素放在一个子序列中,在每个子序列中分别进行直接插入排序,然后缩小间隔d重复上述过程,直到d=1将所有元素放在一个子序列中排序为止。
即先对排序序列做“宏观”调整,“跳跃式”插入排序,最后做微观调整,一般此时已经基本有序,所以希尔排序又称为缩小增量排序
d,增量。d越大,子序列个数越多,子序列长度越小;d越小,子序列个数越少,子序列长度越大。
import java.util.Scanner;
import org.junit.Test;
public class Main3 {
/**
* 希尔排序
* @param a 待排序数组
* @return 排好序数组
*/
public static int[] shellSort(int[] a) {
int left = 0;// 数组左边界下标
int right = a.length - 1;// 数组右边界下标
int gap=right-left-1;//增量的初始值
do{
gap=gap/3+1;//下一个增量值
for (int i =left+gap; i <=right; i++) {//各子序列交替处理
if(a[i]<a[i-gap]){//向前搜索,每次跳跃gap
int temp=a[i];
int j=i-gap;
do{
a[j+gap]=a[j];//后移元素
j-=gap;
}while(j>=left && temp<a[j]);//再比较前一个元素
a[j+gap]=temp; //插入
}
}
}while(gap>1);
return a;
}
@Test
public void testShellSort() {
Scanner sc = new Scanner(System.in);
System.out.println("请输入数组长度!");
int n = sc.nextInt();
int[] a = new int[n];
System.out.println("请输入数组元素");
for (int i = 0; i < a.length; i++) {
a[i] = sc.nextInt();
}
int[] result = shellSort(a);
for (int i = 0; i < result.length; i++) {
System.out.print(result[i] + " ");
}
}
}