希尔排序之交换排序

希尔排序是插入排序的优化版本,通过增量分组进行交换排序,减少了元素移动次数,尤其在数据分布不理想时能显著提高效率。算法包括多轮比较,每轮将数组按增量分为若干组,对每组进行直接插入排序,随着增量逐渐减少,直到增量为1,完成排序。文中用具体例子解释了希尔排序的过程并提供了完整的代码实现。
摘要由CSDN通过智能技术生成

希尔排序之交换排序

  • 问题引入:

在插入排序中,如果数组元素的排列情况比较乐观,那么插入的次数就比较少,那么效率就很高了,可是很多时候,数据就是那么的不敬人意,比如如下的一个待
排序的数组:[2,3,4,5,6,7,1],这个数组,如果使用插入排序,那么就会发生如下的样子:

  1. 第一轮:[2,3,4,5,6,7,7]

  2. 第二轮:[2,3,4,5,6,6,7]

  3. 第三轮:[2,3,4,5,5,6,7]

  4. 第四轮:[2,3,4,4,5,6,7]

  5. 第五轮:[2,3,3,4,5,6,7]

  6. 第六轮:[2,2,3,4,5,6,7]

  7. 第七轮:[1,2,3,4,5,6,7]

这样的就是最不乐观的情况,很浪费时间,所以,后来就有大神研究了一下,优化优化,就发明了希尔排序。

希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。
希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,
整个文件恰被分成一组,算法便终止

  • 数组实例说明:
  1. 比如有一个待排序的数组 [9,6,1,3,0,5.7,2,8,4]

  2. 上面的数组一共有10个元素,它把数组第一次分为 10/2 = 5 组,然后两两比较,大小位置交换:如下:

<?php

$arr = [9,6,1,3,0, 5,7,2,8,4];

$arr[0] > $arr[5] ? '交换位置,小数交换在前,大数交换在后' : '不交换位置';
$arr[1] > $arr[6] ? '交换位置,小数交换在前,大数交换在后' : '不交换位置';
$arr[2] > $arr[7] ? '交换位置,小数交换在前,大数交换在后' : '不交换位置';
$arr[3] > $arr[8] ? '交换位置,小数交换在前,大数交换在后' : '不交换位置';
$arr[4] > $arr[9] ? '交换位置,小数交换在前,大数交换在后' : '不交换位置';

for ($i = 5; $i < 10; $i++) {
   
    for ($j = $i - 5; $j >= 0; $j-=5) {
   
        if ($data[$j] > $data[$j+5]) {
   
            $temp = $data[$j];
            $data[$j] = $data[$j+5];
            $data[$j+5] = $temp;
        }
    }
}

最后第一轮得到的结果就是:[5,6,1,3,0,9,7,2,8,4]

  1. 第二轮又开始比较,第二轮是在之前第一轮的基础上,再次分为 5/2 = 2 组,然后两两交换位置,大小指互换:如下:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值