排序原理
希尔排序(Shellsort),也称递减增量排序算法,是插入排序的一种更高效的改进版本。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
- 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
- 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位
希尔排序是把记录按下标的一定增量分组, 对每组使用直接插入排序算法排序; 随着增量逐渐减少, 每组包含的关键词越来越多, 当增量减至 1 时, 整个文件恰被分成一组, 算法便终止。
我们来看下希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2…1},称为增量序列。希尔排序的增量序列的选择与证明是个数学难题,我们选择的这个增量序列是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。此处我们做示例使用希尔增量。
代码实现
public static void shellSort(int[] arr){
int temp=0;
//将数组分为step组,元素按照歩长step,分组一组
for (int step = arr.length/2; step >0 ; step/=2) {
//从第 step个元素, 逐个对其所在的组进行直接插入排序
for (int i = step; i < arr.length; i++) {
//待插入元素索引
int j=i;
//待插入元素
temp=arr[j];
while (j-step>=0&&temp<arr[j-step]){
arr[j]=arr[j-step];
j=j-step;
}
arr[j]=temp;
}
}
}