形成: 希尔排序与插入有关,插入排序在元素较少时效率比较高,但元素多的时候,比如有100个.如果最 后一个数最小,即a[100]最小,如果用插入排序,必须将前面99个元素分别向后移动一位,这时耗费资源较多.
这时可以利用希尔排序,将一个数组分为多个数组,将a[0],a[10],a[20],…a[100] 为一组,
a[1],a[11],a[11],… a[91] 为一组,
a[2],a[12],a[22],…a[92] 为一组,
…
a[9],a[19],a[29],…a[99] 为一组,
这时a[100]前面的元素只有10个,则只需10个元素分别向后移动一位就行,缩小了10倍.
public static void main(String[] args) {
int[] a= {9,6,11,3,5,12,8,7,10,15,14,4,1,13,2};
int gad=1;
while(gad<=a.length/3) {
gad=gad*3+1;
}
for(int gasd=gad;gasd>=1;gasd=(gasd-1)/3) {
//直接从第5个开始比较大小
for (int i=gasd; i < a.length; i++) {
//为什么是i++.因为不是第一组比完才比较第二组,
//而是先比较第一组的前两个,后比较第二组的前两个,...再比较第一组的前三个
//比较第二组的前三个....
for (int j = i; j >gasd-1; j=j-gasd) {//j层for循环的意义是比较前三个的数大小
if(a[j]<a[j-gasd]) {
int m=a[j];
a[j]=a[j-gasd];
a[j-gasd]=m;
}
}
}
}
for (int i : a) {
System.out.print(i+" ");
}
}