基本思路:
希尔排序出发点是插入排序,插入排序之所以低效,每一次只向前移动一个位置。而希尔排序的思想在于每次将数组项移动若干位置。
这里我们使用3X+1增量序列
import java.util.Scanner;
public class Shell {
public static void sort(Comparable[] a){
int N = a.length;
int h = 1;
while(h<N/3) h = h*3+1;
while(h>=1)
{
for(int i=h;i<N;i++)
{
for(int j=i;j>=h;j=j-h)
{
if(less(a[j],a[j-h]))
{
exch(a,j,j-h);
}
}
}
h=h/3;
}
}
private static void exch(Comparable[] a, int j, int i) {
Comparable temp = a[j];
a[j] = a[i];
a[i] = temp;
}
private static boolean less(Comparable x, Comparable y) {
return x.compareTo(y) <0;
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int N = cin.nextInt();
Long[] a = new Long[N];
for(int i=0;i<N;i++)
{
a[i] = cin.nextLong();
}
sort(a);
for(int i=0;i<N;i++)
{
System.out.print(a[i]+" ");
}
}
}
时间复杂度分析
对于3X+1的增量序列最坏情况下比较的次数是O(N^3/2)
使用于中小型数组,常用与嵌入式系统,代码量少