/*
* 设待排序的元素有n个,首先取一个整数gap<n作为间隔,将全部元素
* 分为gap个子序列,所有间隔为gap的元素放在同一个子序列中,在每
* 一个子序列中分别实施直接插入排序。然后缩小间隔gap,例如取
* gap==(gap/2),重复上述子序列划分和排序工作。直到最后去gap==1,
* 将所有元素放在同一个序列中排序为止。
* 由于开始时gap的取值较大,每个子序列中的元素较少,排序速度较快;
* 待到排序后期,gap取值逐渐变小,子序列中元素个数逐渐增多,但由于前面
* 工作的基础,大多数元素基本有序,所以排序速度仍然很快。
*/
public class ShellSort <E extends Comparable<E>>
{
private E[] elementArray;
int length;
public ShellSort(E[] array)
{
elementArray = array;
length = array.length;
}
public void sort()
{
int gap = length;
do {
gap = (gap/3)+1;
for(int i=gap;i<length;i++)
{
int j = i-gap;
if (elementArray[i].compareTo(elementArray[j])<0)
{
E temp = elementArray[i];
do {
elementArray[j+gap] = elementArray[j];
j=j-gap;
} while (j>=0&&elementArray[j].compareTo(temp)>0);
elementArray[j+gap] = temp;
}
}
} while (gap>1);
}
public void print()
{
for (int i = 0; i < elementArray.length; i++)
{
System.out.println(elementArray[i]);
}
}
}
Example for the model:
Integer[] array5 = {36,3,2,2,9,1,4,8};
ShellSort<Integer> test5 = new ShellSort<>(array5);
test5.sort();
test5.print();
The result of of the example:
1
2
2
3
4
8
9
36