希尔排序(Shell Sort),是插入排序的一种,由D.L.Shell于1959提出而得名。
Shell排序通过将数据分成不同的组d,先对每一组进行排序,然后再对所有的元素进行一次插入排序,以减少数据交换和移动的次数。其中分组的合理性会对算法产生重要的影响。
Shell排序比冒泡排序快5倍,比插入排序大致快2倍。Shell排序比起QuickSort,MergeSort,HeapSort慢很(这些数据是网上转载的,没有认真考证过)。但是Shell Sort 相对比较简单,它适合于数据量在5000以下并且速度并不是特别重要的场合。它对于数据量较小的数列重复排序是非常好的。
public class ShellSort {
public static void shellSort(int[] arrSrc) {
int d = arrSrc.length;
while (d > 1) {
d = (d + 1) / 2;
for (int i = 0, length = arrSrc.length; i < length - d; i++) {
if (arrSrc[i + d] < arrSrc[i]) {
int tmp = arrSrc[i + d];
arrSrc[i + d] = arrSrc[i];
arrSrc[i] = tmp;
}
}
System.out.println("当前这一遍处理时,d=" + d + " ,结果是:");
for (int data : arrSrc) {
System.out.print(" " + data);
}
System.out.println();
}
}
public static void main(String[] args) {
int[] arr = { 49, 38, 65, 97, 76, 13, 27, 49, 55, 4 };
ShellSort.shellSort(arr);
}
}
运行结果:
当前这一遍处理时,d=5 ,结果是:
13 27 49 55 4 49 38 65 97 76
当前这一遍处理时,d=3 ,结果是:
13 4 49 38 27 49 55 65 97 76
当前这一遍处理时,d=2 ,结果是:
13 4 27 38 49 49 55 65 97 76
当前这一遍处理时,d=1 ,结果是:
4 13 27 38 49 49 55 65 76 97