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);
运行结果: