前面介绍过插入排序,其实shell排序的思想跟插入排序一样。具体过程如下:
(1)将n个元素的数组分成n/2个数字序列,第1个与第n/2+1个为一组。
(2)对这些元素插入排序
(3)然后,变为n/4个数字序列,再次排序。
(4)不断重复,直到序列变为1个。
数字4 5 8 7 1 6 3 7
序号0 1 2 3 4 5 6 7
第一次4 1|5 6|8 3|7 7四组
排序后:1 5 3 7 4 6 8 7
第二次1 7 8|5 4 7|3 6三组
排序后:1 4 3 7 5 6 8 7
第三次:1 3 5 8|4 7 6 7两组
排序后:1 4 3 6 5 7 8 7
第四次:1 4 3 6 5 7 8 7一组
排序后:1 3 4 5 6 7 7 8
程序:
static void shellSort(int[] a) //Shell排序
{
int i,j,h;
int r,temp;
int x=0;
for(r=a.length/2;r>=1;r/= 2) //划组排序
{
for(i=r;i<a.length;i++)
{
temp=a[i];
j=i-r;
while(j>=0 && temp<a[j])
{
a[j+r]=a[j];
j-=r;
}
a[j+r]=temp;
}
}
}
因为插入排序,对已经有一定顺序的序列排序效率会提高,希尔排序就是基于这个思想进行的。