希尔排序的思想就是将排序对象分为步长序列进行插入排序,步长序列的增量是递减的,那么什么是步长序列呢?简单的说就是将一个大的序列按照固定的增量分为若干个小的序列,当数字作为序列的下标时,1,3,5,7,9就是一个步长序列,仔细考虑考虑不难理解,若一个长度为10的序列,将其按照增量为5来分段,此时要进行插入排序的分别是下标为0和5,1和6,2和7,3和8,4和9的元素,话不多说,咱们直接来看代码:
package pp.suanfa;
/**
* 希尔排序
* @author xiaoGd
*
*/
public class TestShell {
public static void shellSort(int array[])
{
int length = array.length;
int i,j;
int h;
int temp;
for(h=length/2;h>0;h=h/2)//第一层for循环用来确定步长序列的增量
{
for(i=h;i<length;i++)//第二层for循环用来确定每段步长序列进行插入排序的基准数
{
temp = array[i];//1.temp = array[i];
for(j=i-h;j>=0;j-=h)//第三层for循环用来将每段步长序列中其它的数同基准数进行比较
{
if(temp<array[j])
{
array[j+h] = array[j];//2.array[i] = array[j];
}
else
break;
}
array[j+h] = temp;//3.array[j] = temp; 因为执行完j-=h;后,j+h就等于for循环中的j
//通过上面的1、2、3步完成位置的互换
}
}
}
public static void main(String[] args) {
int i = 0;
int[] a = {5,4,9,8,7,6,0,1,3,2};
int len = a.length;
shellSort(a);
for(i=0;i<len;i++)
{
System.out.print(a[i]+" ");
}
}
}
运行结果为: