算法:希尔排序

希尔排序是基于插入排序的快速排序算法,通过设置增量序列来优化排序过程,使得大规模乱序数组的排序效率提升。它首先将数组分为多个子序列,然后对每个子序列进行插入排序,最后使用插入排序完成整个数组的排序。递增序列的选择对排序性能有很大影响,通常要求最后一个增量为1且避免值互为倍数。希尔排序有效地平衡了子数组的规模和有序性,提高了排序效率。
摘要由CSDN通过智能技术生成

希尔排序

希尔排序是一种基于插入排序的快速排序算法。对于大规模乱序数组插入排序很慢,因为它只会交换相邻的元素,因此元素只能一点一点的从数据的一段移动到另一端。例如,如果数据最小的元素正好在数据的尽头,要将它挪到正确的位置就需要移动N-1次。希尔排序为了加快速度简单地改进了插入排序,交换了不相邻的元素以对数据的局部进行排序,并最终用插入排序将局部有序的数组排序。

希尔排序的思想是使数组中任意间隔为h的元素是有序的。这样的数组被称为h有序数组。换句话说,一个h有序数组就是h个相互独立的有序数组编织在一起组成的一个数组。在进行排序时,如果h很大,我们就能够将元素移动到很远的地方,为实现更小的h有序创造方便。 一下算法使用了序列1/2(3^k-1),从N/3开始递减至1.我们把这个序列称为递增序列。(很多论文研究了各种不同的递增序列,但都无法证明某个序列是“最好的”)

好的递增序列的共同特征:
① 最后一个增量必须为1;
② 应该尽量避免序列中的值(尤其是相邻的值)互为倍数的情况。

希尔排序更高效的原因是它权衡了子数组的规模和有序性。排序之初,各个子数组都很短,排序之后子数组都是部分有序的,这种情况都很适合插入排序。子数组部分有序的程度取决于递增序列的选择。透彻理解希尔排序的性能至今仍是一项挑战。

public class Shell {
   //希尔排序
    public static void sort(Comparable[] a){
   //按升序排列
        int N = a.length;
        int h = 1;
        while(h < N / 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值