在菊花厂上班,晚上回来就两小时,我还在坚持学习代码,我真是越来越佩服自己了。
言归正传,希尔排序,我第一个遇见需要花较长时间理解的算法(年纪大了,手动哭笑),记录一下:
public static void sort(Comparable[] a) {
int N = a.length;
int h = 1;
while (h < N / 3) //设定一个h有序数组,h用来控制希尔排序时的间隔
{
h = h * 3 + 1;
}
while (h >=1) //
{
for (int i = h; i < N; i ++) //从h开始,对后面的数进行间距h的插入排序,注意,当时不理解是因为最小循环只进行了
//一次插入排序,但是随着i增大,间距h的子数组完全进行了插入排序,得到了有序的子数组。
{
for (int j = i; j >=h && less(a[j],a[j-h]); j -= h) //将数组拆分为间距h的子数组,并进行插入排序
{
exch(a, j, j - h);
}
}
h = h / 3;
}
}