算法练习--直接插入排序希尔排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法练习--直接插入排序希尔排序相关的知识,希望对你有一定的参考价值。

背景:

  原来虽然有学过数据结构,排序一些,但是没有好好学,现在复习一下

正题:

  1、直接插入排序

    直接贴一下百科:每次取出无序数组中的一个数,把他和有序数组中的数比较,插到适当位置,直到无序表为空,有序表满。

    原理很简单,就我而言,首先想到的是新建一个new_list数组,充当有序表,然后一步一步将无序表里的值拿出来放到新的数组中。但是,写完之后,看了看书上的实例,  上面直接用单数组也可以,虚拟划分数组为两部分。代码简便多。于是很我也修改了一下自己的代码。

    代码如下:

<?php

function STR_I_sort($list)
{
    array_unshift($list , 0);
    
    for($i = 1; $i < count($list); $i++)
    {
        $list[0] = $list[$i];
        $j = $i - 1;
        while($j > 0 && $list[0] < $list[$j])
        {
            $list[$j+1] = $list[$j--];
        }
        $list[$j+1] = $list[0];
    }
    array_shift($list);
    return $list;
}

$list = array(36,25,48,12,65,43,20,36);
print_r(STR_I_sort($list));
//Array ( [0] => 12 [1] => 20 [2] => 25 [3] => 36 [4] => 36 [5] => 65 [6] => 43 [7] => 48 )
?>

 

    其中对数组添加了一个list[0],目的是为了存储当前想要插入的值,一面数组向后移动时覆盖掉该值。百科上说,可以用list[0]控制数组越界,不过我没什么特别大的感觉。。

  2、希尔排序

    原理:先取一个小于n的整数d1作为第一个增量,把数据分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量 技术分享 =1( 技术分享 <技术分享 …<d2<d1),即所有记录放在同一组中进行直接插入排序为止。(增量序列取值是一个有待考究的问题,不过为了简便一些,使用技术分享 = 技术分享 / 2)

    希尔排序其实是对直接插入排序的一中改进,对于直接插入排序,如果给出序列越接近有序,那么直接插入排序的效率就越高。因此,采用这种分组的方式,先让每一组有序,直到最后完全有序。其中我认为麻烦的一点就是如何将每个组都进行直接插入排序。开始想的是每个组提取出来单独的进行排,但是发现不太可行。于是看了看实现方法,发现都是交替并按照原序列下标顺序进行替换操作。

    代码如下:

<?php
function Shell_sort($list)
{    
    $count = count($list);
    $step = floor($count/2);        //步长

    while($step > 0)
    {
        for($i = $step ; $i < $count ; $i++)
        {
            $j = $i - $step;
            while($j>=0 && $list[$j] > $list[$j+$step])
            {
                $tmp = $list[$j];
                $list[$j] = $list[$i];
                $list[$i] = $tmp;

                $j = $j - $step;
            }
        }
        $step = floor($step/2);
    }
    return $list;
}

$list = array(165,12316,123,496,1265,123,456,1515);
print_r(Shell_sort($list));
//Array ( [0] => 123 [1] => 123 [2] => 165 [3] => 456 [4] => 496 [5] => 1265 [6] => 1515 [7] => 12316 )
?>

over。这几天准备把排序系统都看一看,然后再去看点好玩的题目。

以上是关于算法练习--直接插入排序希尔排序的主要内容,如果未能解决你的问题,请参考以下文章

插入排序(直接插入排序折半插入排序希尔排序的算法思想及代码实现)

算法3 七大排序之:直接插入排序和希尔排序

第三篇,插入排序算法:直接插入排序希尔排序

排序算法之插入排序(直接插入希尔排序)

从直接插入排序到希尔排序

排序算法之插入排序(直接插入排序折半插入排序希尔排序)