目录
什么是希尔排序
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。
插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;当需要插入的数据越小,则数据需要移动的次数愈多
希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。
简单来说,希尔排序是将数据分组,将每一组进行插入排序。每一组排成有序后,最后整体就变有序了。
步骤
设定步长为数组的一半,并且依次分组,进行插入排序。
执行完成后步长变为一半继续执行。
直到执行完步长为1时,结束。这样就能先把小的数据放到前面。
案例说明
数组:9125748635
首先计算出步长,步长为10/2=5
将数据分组如下图:9125748635,其中94一组,18,26,53,73
将每个分组进行排序结果为4123598657
再次计算新的步长,5/2=2.5 这里新的步长为2
再次将新的数组分组4123598657,其中42585一组,13967一组
每个分组进行插入排序结果为2143565789
最后一次的步长为1,
这里在进行插入排序的话,就比从一开始就插入排序要更好,通过多次分组的插入排序让这个数据小的整体在左,大的整体在右,更加快捷。
代码实现(Java)
public class xier {
public static void main(String[] args) {
int[] a= new int[]{1,5,9,2,4,3,8,6};
int step = a.length/2;
// System.out.println(step);
do {
for (int i = step; i < a.length; i++) {
for (int j = i - step; j >= 0; j=j-step) {
if (a[j] > a[j + step]) {
int temp = a[j];
a[j] = a[j + step];
a[j + step] = temp;
}
}
}
step = step/2;
}while (step>0);
System.out.println(Arrays.toString(a));
}
}