希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。
希尔排序通过加入一个”增量“来使交换次数减少,我们先看算法相关的图解,随后再附上代码:
,
因为进行比较两数的索引之差为h,循环体部分应为:
for (int i = h; i < a.length; i++) {
for (int j = i; j >= h; j-=h) {
//待插入值a[j]
if (a[j]<a[j-h]){
swap(a,j,j-h);
}else { //已排序好 结束循环
break;
}
}
}
else部分是在已经排序好的情况下去跳出内部的一个for循环达到减少比较次数的效果,
希尔排序并不难,只是插入排序的优化版,下面附上一个动图更有利于理解该算法:
下面我们附上完整代码:
import java.util.Arrays;
public class ShellSort {
public static void main(String[] args) {
int[] a = {9,1,2,5,7,4,8,6,3,5};
System.out.println("--------排序前数组a--------");
System.out.println(Arrays.toString(a));
int h = a.length/2;
while (h>=1) {
for (int i = h; i < a.length; i++) {
for (int j = i; j >= h; j-=h) {
//待插入值a[j]
if (a[j]<a[j-h]){
swap(a,j,j-h);
}else {
//已排序好 结束循环
break;
}
}
}
//每次增量减半
h=h/2;
}
System.out.println("--------排序后数组a--------");
System.out.println(Arrays.toString(a));
}
//交换两数位置方法
public static void swap(int[] a , int i ,int j){
int temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
运行结果为:
空间复杂度为O(n^(3/2)) 其证明留到下次在详解~
欢迎大家多多评论,提出自己的意见和疑问~