迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 算法 >

排序算法学习之路——希尔排序

作者:迹忆 最近更新:2016/01/05 浏览次数:

希尔排序是按照该算法的设计者的名字希尔 命名的,其产生是希尔在插入排序的基础上改进的,可以说是一种特殊的插入排序。

下面先介绍一下插入排序的性质:

首先,插入排序算法对于已经有序的数据进行操作的时候,效率很高,可以达到线性排序的效率。

其次,插入排序进行排序的时候,每一趟排序只能移动一个数据。所以说这样的排序方法相对来说效率又比较低。

基于此性质,希尔排序的设计者发明了希尔排序算法,其基本思想是:

先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,分割子序列的方法就是设定一个增量,待当下的每个子序列有序的时候,将增量减一半(除以2,取整),再次进行子序列的排序。依次进行,待整个序列中的记录基本上有序的时候,再对全体记录进行依次直接插入排序,此时增量减为1,因为直接插入排序在元素基本有序的情况下(根据上述第一点,接近最好的情况),效率是很高的。

因此,对于希尔排序,总结一句话,就是一种分组插入方法。因为设定了一个增量,并且依次将增量减1,所以希尔排序又称为递减增量排序算法。

对于希尔排序的算法步骤,可以用下图来表示

希尔排序算法原理图1

希尔排序算法原理图2

希尔排序算法原理图3

在这里需要说一下,希尔排序是稳定排序,我们可以设定一组数据按照上述方式进行排序,可以发现其为稳定排序。

希尔排序在按照增量分组以后,其组内的排序可以使用插入排序,当然也可以使用冒泡排序、选择排序等等

下面奉上希尔排序的PHP实现代码

$arr = array(10,6,20,50,30,7,23,35,40,1,17);
/*
 * 首先初始化 增量  数组长度/2 取整 floor() 函数向下取整  对于增量每次循环都由 当前增量/2
 */
for($dl=floor(count($arr)/2);$dl>=1;$dl=floor($dl/2)){
    /*
     * 每次从 增量的位置开始,直到数组递增变量达到数组的长度
     */
    for($j=$dl;$j<count($arr);$j++){
        for($i=$j-$dl;$i>=0;$i-=$dl){
            if($arr[$i+$dl]<$arr[$i]){
                $temp = $arr[$i+$dl];
                $arr[$i+$dl]=$arr[$i];
                $arr[$i]=$temp;
            }
        }
    }
}

以上代码只是其中的一种实现方式,其代码实现有很多种,仅仅针对组内的排序方式就有很多,如果大家有什么好的方法,欢迎从下面留言,大家共同讨论,共同提高。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

MATLAB 对行进行排序

发布时间:2023/04/23 浏览次数:198 分类:MATLAB

本教程将讨论使用 MATLAB 中的 sortrows() 函数对矩阵中存在的行进行排序。在数据分析和处理中,排序是必不可少的,因为它可以使数据在排序时易于分析和处理。

在 PHP 中使用 MongoDB 作为文件存储

发布时间:2023/04/20 浏览次数:132 分类:MongoDB

在为大文件创建可扩展存储方面,MongoDB 及其 GridFS(使用 MongoDB 查询语言 - MQL 编写)是市场上最好的文件存储解决方案之一。 在本教程中,您将学习如何在 PHP 中使用 MongoDB 作为文件存储。

在 Angular 中对表格进行排序

发布时间:2023/04/11 浏览次数:69 分类:Angular

我们可以按升序、降序等方式对表进行排序。现在让我们看看在 Angular 框架内创建具有排序功能的表的最佳方法。

在 C++ 中对字符串进行排序

发布时间:2023/03/31 浏览次数:102 分类:C++

本文演示了如何在 C++ 中对字符串进行排序。在本文中,我们假设字符序列存储在 std::string 对象中。

如何在 PHP 中获取时间差的分钟数

发布时间:2023/03/29 浏览次数:181 分类:PHP

本文介绍了如何在 PHP 中获取时间差的分钟数,包括 date_diff()函数和数学公式。它包括 date_diff()函数和数学公式。

PHP 中的重定向

发布时间:2023/03/29 浏览次数:133 分类:PHP

本教程演示了如何将用户从页面重定向到 PHP 中的其他页面

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便