shell排序_数据结构与算法 — 希尔排序法

排序原理:1.选定一个增长量h,按照增长量h作为数据分组的依据,对数据进行分组。
2.对分好组的每一组数据完成插入排序。
3.减小增长量,最小减为1,重复第二步操作。

c1d3632814b921d7b29bd036a42ba6bb.png

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的逆向数据,我们

可以根据这个批量数据完成测试。测试的思想:在执行排序前前记录一个时间,在排序完成后记录一个时间,两个

时间的时间差就是排序的耗时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值