PHP 插入排序 -- 希尔排序

1.希尔排序 -- Shell Insertion Sort

时间复杂度:数学家正在勤劳的探索!

适用条件: 直接插入排序的改进,主要针对移动次数的减少,这取决于"增量队列"的取值。适用的情况凭个人感觉用吧,我也不知道,反正,我并不认为自己是一个程序员,喜欢凭感觉行事。

 1 <?php
 2 $arr = [3,4,5,1,11,9,27,27,18,20];
 3 
 4 
 5 function shellSort(array &$arr,$dt)
 6 {
 7     // 跟增量相关,直接排序的改进版,当倒序时,可以极大减少移动的次数。
 8     $straightInsertFunc = function (array &$arr,$dt)
 9     {
10         $guild = 0;  // 监视哨
11         array_unshift($arr, $guild);
12         $arr = array_values($arr);
13         $len = count($arr);
14 
15         for($j = 1+$dt;$j < $len;$j += 1)
16         {
17             if($arr[$j] < $arr[$j-$dt])
18             {
19                 $arr[0] = $arr[$j];
20                 $arr[$j] = $arr[$j-$dt];
21                 for($k = $j-2*$dt;$k >0 && $arr[0] < $arr[$k];$k -= $dt)
22                 {
23                     $arr[$k+$dt] = $arr[$k];
24                 }
25                 $arr[$k+$dt] = $arr[0];
26             }
27         }
28         array_shift($arr);
29     };
30 
31     if($dt <= 0)
32     {
33         throw new Exception('Param $dt error!');
34     }
35 
36     for($i = $dt; $i >= 1; --$i)
37     {
38         $straightInsertFunc($arr,$dt);
39     }
40 }
41 
42 shellSort($arr,1);
43 echo implode(',',$arr);

 

运行结果:

 

posted @ 2017-03-02 00:02  GoodByeZ  阅读(274)  评论(0编辑  收藏  举报