排序算法——希尔排序
希尔排序:是直接插入排序算法的一种更高效的改进版本。又称“缩小增量排序”(Diminishing Increment
Sort)。希尔排序是非稳定排序算法。
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量为1,即所有记录放在同一组中进行直接插入排序为止。
例如一组数组{9,8,7,6,5,4,3,2,1},增量序列的取值依次为:5、2、1。
首先,选择增量gap=9/2=5(向上取整),整个数组分成了5组,分别为【9,4】、【8,3】、【7,2】、【6,1】、【5】,对每组进行插入排序,如下所示:
然后缩小增量为gap=5/2=2(向下取整),整个数组分成了2组,分别为【4,2,5,8,6】、【3,1,9,7】,再对这两组进行插入排序,如下所示:
最后缩小增量为gap=2/2=1,整个数组分成了1组,为【2,1,4,3,5,7,6,9,8】,此时,只需对数组进行微调即可完成整个数组的排序,如下所示:
Java代码实现:
public static void main(String[] args) {
int[] arr = {9,8,7,6,5,4,3,2,1};
shellSort(arr);
}
public static void shellSort(int[] arr) {
int len = arr.length;//首先选取一个增量序列
int gap = (int) Math.ceil(Float.valueOf(len) / 2);//先找出增量序列最大的增量值
System.out.println("增量值:\t"+gap);
while (gap > 0) {
for (int i = gap,z = 1; i < len; i++,z++) {
int tmp = arr[i];
int j = i - gap;
while (j >= 0 && arr[j] > tmp) {
arr[j + gap] = arr[j];
j -= gap;
}
arr[j + gap] = tmp;
System.out.format("第%d趟:\t", z);
for (int l : arr) {
System.out.print(l+",");
}
System.out.println();
}
gap = (int) Math.floor(gap / 2);
if (gap >= 1) {
System.out.println("增量值:\t"+gap);
}
}
}