希尔排序算法

希尔排序是一种改进的插入排序算法,通过设定不同的增量分组进行排序,逐步减少增量直到为1,从而提高了排序效率。在无序序列中,希尔排序能更快地进行元素比较,而在接近有序的序列中,插入排序效率更高。代码示例展示了两种不同的希尔排序实现方式。
摘要由CSDN通过智能技术生成

目录

 原理

 图解

 代码


原理

希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。它与插入排序的不同之处在于,它会优先比较距离较远的元素

希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高

  • 分组 
  • 缩小增量
  • 直接插入

图解

在这里插入图片描述

 代码

<?php

function shellSort(&$arr){
    $count = count($arr);
    $inc = $count;
    while ($inc > 1) {
        //计算增量
        //$inc = floor($inc / 3) + 1;
        $inc = ceil($inc  / 2);
        for ($i = $inc; $i < $count; $i++) {
            $temp = $arr[$i];    //设置哨兵
            //需将$temp插入有序增量子表
            for ($j = $i - $inc; $j >= 0 && $arr[$j + $inc] < $arr[$j]; $j -= $inc) {
                $arr[$j + $inc] = $arr[$j]; //记录后移
            }
            //插入
            $arr[$j + $inc] = $temp;
        }
        //增量为1时停止循环
    }
}

$arr = [2,5,6,10,3,0,1];
shellSort($arr);
print_r($arr);
function shellSort(&$arr) {
    $max = count($arr)-1;
    $gap = count($arr)-1;
    while($gap > 1) {
        $gap = $gap/2;
        for ($i=0; $i<=$max-$gap; $i++) {
            for ($j=$i; $j<=$max-$gap && $arr[$j] > $arr[$j+$gap]; $j+=$gap) {
                $temp = $arr[$j];
                $arr[$j] = $arr[$j+$gap];
                $arr[$j+$gap] = $temp;
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值