對於排序的演算法我想大家首先想到的事 氣泡排序;快速排序;或者想起選擇和插入排序;
今天的講解並不是以上四種;而是希爾排序;
對18w個數字排序,時間比較(毫秒) 希爾排序 0.1s 就完成了,有點不敢相信,插入排序用了4.2s
理解這些複雜的排序演算法還是很有意思的,體會這些排序演算法的精妙~
一、希爾排序(shell sort):希爾排序是基於插入排序的,區別在於插入排序是相鄰的乙個個比較(類似於希爾中h=1的情形),而希爾排序是距離h的比較和替換。
希爾排序中乙個常數因子n,原陣列被分成各個小組,每個小組由h個元素組成,很可能會有多餘的元素。當然每次迴圈的時候,h也是遞減的(h=h/n)。第一次迴圈就是從下標為h開始。希爾排序的乙個思想就是,分成小組去排序。
理解這些演算法,最好是有個圖示。就先來**吧。
<?php
/** * 希爾排序
*/function shell_sort(array $arr)
while ($h >= 1)
//print_r($arr);echo '
'; // 開啟這行注釋,可以看到每一步被替換的情形}}
$h = intval($h/$f);
}return $arr;
}$arr = array(14, 9, 1, 4, 6, -3, 2, 99, 13, 20, 17, 15, 3);
$shell = shell_sort($arr);
echo '';
print_r($shell);
/** *
array
([0] => -3
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[5] => 6
[6] => 9
[7] => 13
[8] => 14
[9] => 15
[10] => 17
[11] => 20
[12] => 99))
* */
?>
希爾排序實現
希爾排序算是插入排序的一種高階進化版,雖然希爾排序的實現比較簡單,但是它的原理證明非常複雜,由於能力有限,故沒有涉及。我直接上 吧。include intcontainer 1000001 int main void int increment,temp for increment n 2 incr...
PHP 排序演算法(五) 希爾排序
希爾排序 希爾排序又稱縮小增量排序,是指將無序序列,按照增量的不同大小,分成若干個序列,然後對子序列進行插入排序,本質上就是插入排序。思路 我們先確定增量,一般初始增量我們都設定為陣列長度的一半 向下取整 我們根據增量,將陣列分成了若干個子串行 分別對這四個子串行進行插入排序 然後再一次遍歷,增量設...
希爾排序C 實現
shell sort 希爾排序是一種對直接插入排序的改進方法,使用直接插入排序對於乙個基本有序的數列進行排序時,內部迴圈的次數會明顯減少,因此可以減小時間複雜度 希爾排序就是先使數列基本有序,然後再直接插入排序,減小插入排序的時間複雜度 希爾排序首先按一定增量進行插入排序,再逐步縮減增量,當這一增量...