希尔排序是插入排序的改良版,但是比较难理解,他是把大的排序分解成越来越小范围的排序,最终最小的时候,完成整个排序。
举个小栗子:2 4 1 3 5 降序来排,具体请看代码
1.拿1和2比较,显然1<2 所以不交换
2.都后移一位 3和4比较 3<4 不交换
3.接着后移一位,5和1比较,5>1 交换,变成
2 4 5 3 1
只要交换了,继续比较,拿5和2比较,5>2 交换 变成
5 4 2 3 1
细心的朋友都看出来,要比较的两个数中间都空开一个,具体空几个要看第一次的时候和第一数比较的时候空几个。
4.然后长度再除以2,变为1,那就从脚标为1和第一个数比较,和上面一样,这里就不重复了...
5.最后长度除以2<0时就结束了 。
后面链接是一个希尔排序的舞蹈,可以更好地理解希尔排序。
public class example02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a ={1,2,3,4,5,6};
for(int i=a.length/2;i>0;i/=2)//确定从哪开始
{
for(int j=i;j<a.length;j++)//实际控制的角标
{
int temp=a[j];//复制一份,比较和赋值时用,而又不改变原来的数据
int k=0;
for(k=j;k>=i;k-=i)//核心
{
if(temp>a[k-i])
a[k]=a[k-i];
else
break;
}
a[k]=temp;
}
}
for(int i:a)
System.out.print(i+" ");
}
}