背景:
原来虽然有学过数据结构,排序一些,但是没有好好学,现在复习一下。
正题:
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。这几天准备把排序系统都看一看,然后再去看点好玩的题目。
时间: 2024-10-09 21:20:02