码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-03-30 22:14:59      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

背景:

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

正题:

  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。这几天准备把排序系统都看一看,然后再去看点好玩的题目。

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

标签:

原文地址:http://www.cnblogs.com/onyourway/p/5338987.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!