希尔排序:
当对0,4,8号数据项完成排序之后,算法向右移动一步,对1,5,9数据项进行排序。这个过程持续进行,直到所有的数据项都已经完成了4-增量排序,也就是说所有间隔为4的数据项之间都已经排列有序
在完成以4为增量的希尔排序后,所有元素离他在最终有序序列中的位置都相差不到两个单元。这就是数组基本有序的含义,也正是希尔排序的奥秘所在。这种交错的内部有序的数据项集合,把完成排序所需的工作量降到了最小。
而插入排序对基本有序的数组排序是非常有效的,这样,当数组完成4-增量排序之后,可以进行普通的插入排序,比普通的插入排序快得多。
public class ShellSortTest
{
// int number; //数据个数
public static void shellSort(int array[])
{
int h=1; //设定初始值h
int number=array.length;
while(h<= number /3 )
h =h*3+1; //(1,4,13,40,121...)
while(h>0)
{
for(int i= h;i<number;i++)
{
int temp = array[i];
//插入排序
int j= i;
while(j>h-1 && array[j-h] >=temp)
{
array[j] =array[j-h];
j=j-h;
}
array[j] =temp;
}
h=(h-1) /3;
}
}
public static void main(String[] args)
{
int array[] = {2,4,3,33,22,3,66,77,22,2,343,4,6,3,7,78,3,8,87,5,5,3,334,33,543,4,44,3,3};
System.out.println("排序前:");
for (int i = 0; i < array.length; i++)
{
System.out.print(array[i]+" ");
}
System.out.println("");
shellSort(array);
System.out.println("排序后:");
for(int i=0;i<array.length;i++)
{
System.out.print(array[i]+" ");
}
}
}
希尔排序的原则:直到现在,除了在一些特殊的情况下,希尔排序的时间级大约是 O(N^3/2)到O(N^7/6)