package sort;
import java.util.Arrays;
public class ShellSort {
public static void main(String[] args) {
int[] a = {3,6,2,9,5,8,7,1,4};
shellSort(a);
System.out.println(Arrays.toString(a));
}
/*每一趟gap循环就是对若干个独立的子数组执行一次插入排序
使用希尔增量时希尔排序的最坏情形运行时间为O(N^2)
使用Hibbard增量的希尔排序的最坏情形运行时间为O(N^1.5)
然而希尔排序的平均情况分析是一个长期未解决的问题*/
public static <T extends Comparable<? super T>> void shellSort(T[] a){
for (int gap = a.length/2; gap>0; gap/=2){
for (int i=gap; i<a.length; i++){
//小技巧,不显式使用交换,先将a[i]进行“悬空”保存在tmp中,
//等发现了合适的位置(while结束)再插入
T tmp = a[i];
int j = i;
while (j>=gap && tmp.compareTo(a[j-gap]) < 0){
a[j] = a[j - gap];
j -= gap;
}
a[j] = tmp;
}
}
}
//排序整型数组的简化形式
public static void shellSort(int[] a){
for (int gap = a.length/2; gap>0; gap/=2){
for (int i=gap; i<a.length; i++){
int tmp = a[i];
int j = i;
while (j>=gap && tmp < a[j-gap]){
a[j] = a[j-gap];
j -= gap;
}
a[j] = tmp;
}
}
}
}
排序算法之希尔排序
最新推荐文章于 2018-03-05 16:44:55 发布