排序原理:1.选定一个增长量h,按照增长量h作为数据分组的依据,对数据进行分组。
2.对分好组的每一组数据完成插入排序。
3.减小增长量,最小减为1,重复第二步操作。
public class Shell { /* 对数组a中的元素进行排序 */ public static void sort(Comparable[] a){ //1.根据数组a的长度,确定增长量h的初始值; int h = 1; while(h2){ h=2*h+1; } //2.希尔排序 while(h>=1){ //排序 //2.1.找到待插入的元素 for (int i=h;i //2.2把待插入的元素插入到有序数列中 for (int j=i;j>=h;j-=h){ //待插入的元素是a[j],比较a[j]和a[j-h] if (greater(a[j-h],a[j])){ //交换元素 exch(a,j-h,j); }else{ //待插入元素已经找到了合适的位置,结束循环; break; } } } //减小h的值 h= h/2; } } /* 比较v元素是否大于w元素 */ private static boolean greater(Comparable v,Comparable w){ return v.compareTo(w)>0; } /* 数组元素i和j交换位置 */ private static void exch(Comparable[] a,int i,int j){ Comparable temp; temp = a[i]; a[i]=a[j]; a[j]=temp; }}
测试类
import java.util.Arrays;public class ShellTest { public static void main(String[] args) { Integer[] a = {9,1,2,5,7,4,8,6,3,5}; Shell.sort(a); System.out.println(Arrays.toString(a));//{1,2,3,4,5,5,6,7,8,9} }}
希尔排序的时间复杂度分析:
在希尔排序中,增长量h并没有固定的规则,有很多论文研究了各种不同的递增序列,但都无法证明某个序列是最
好的,对于希尔排序的时间复杂度分析,已经超出了我们课程设计的范畴,所以在这里就不做分析了。
我们可以使用事后分析法对希尔排序和插入排序做性能比较。
在资料的测试数据文件夹下有一个reverse_shell_insertion.txt文件,里面存放的是从100000到1的逆向数据,我们
可以根据这个批量数据完成测试。测试的思想:在执行排序前前记录一个时间,在排序完成后记录一个时间,两个
时间的时间差就是排序的耗时。