最近一直在看算法书,本博客的代码也是根据书上的算法所敲出的。今天在看希尔排序,因为插入排序如果后面的数据较小,则需要做的交换次数过多,严重减慢效率,因而有了希尔排序。什么是希尔排序呢?所谓希尔排序就是将数据分为h个组,对每个组单独进行插入排序,而后减小h,分为较少的组,并进行插入排序,如此循环直至h为1为止。而本算法中,对于h的取值尚不太明确为何如此取值,本算法中h的取值为1,4,13,40,121......等值,其最大值不超过N/3,其中N为数组长度即数据的个数,下面是希尔排序的相应代码。
public class Shell {
public static void exch(Comparable[] a, int i, int j)//交换i和j位置的数据
{
Comparable temp = a[i];
a[i] = a[j];
a[j] = temp;
}
public static boolean less(Comparable a, Comparable b)//比较大小
{
return a.compareTo(b) < 0;//a小于b时,compareTo返回值-1
}
public static void sort(Comparable[] a)
{
int len = a.length;//数组长度
int h = 1;
while(h < len/3)
h = h * 3 + 1;//根据数组长度确定步长h的值
while(h >= 1)//h逐渐减小
{
for(int i = h; i < len; i++)//对每个数组进行插入排序,从每个数组的第二个开始插入前面已经排好的数据中,i为要插入的数据
{
for(int j = i; j >= h; j -= h)//该处是已经排好序的数据,将要插入的数据与已经排好的数据挨着比较,若较小则交换
{
if(less(a[j], a[j - h]))//将要插入的数据与本数组中它的前一个数据比较,若要插入的数据较小,则交换
exch(a, j - h, j);
}
}
h /= 3;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] a = {"S", "H", "E", "L", "L", "S", "O", "R", "T", "E", "X","A", "M", "P", "L", "E"};
sort(a);
for(int i = 0; i < a.length; i++)
{
System.out.print(a[i]);
}
}
}