php-希爾排序

<?php
/*
希爾排序的實質就是分組插入排序,該方法又稱縮小增量排序,因 DL.Shell於 1959 年提出而得名。
該方法的基本思想是:先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。因爲直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的。
以 n=10 的一個數組 49, 38, 65, 97, 26, 13, 27, 49, 55, 4 爲例第一次 gap = 10 / 2 = 5 
	49 38 65 97 26 13 27 49 55 4
	1A             1B
 	   2A 			  2B
 		  3A             3B
			 4A				4B
 				5A 				5B
1A,1B,2A,2B 等爲分組標記,數字相同的表示在同一組,大寫字母表示是該組的第幾個元素,每次對同一組的數據進行直接插入排序。即分成了五組(49, 13) (38, 27) (65, 49) (97, 55) (26, 4)這樣每組排序後就變成了(13, 49) (27, 38) (49, 65) (55, 97) (4, 26),下同。

第二次 gap = 5 / 2 = 2
排序後
	13 27 49 55 4 49 38 65 97 26
	1A 	  1B 	1C 	 1D    1E
	   2A 	 2B   2C 	2D 	  2E

第三次 gap = 2 / 2 = 1
	4 26 13 27 38 49 49 55 97 65
	1A 1B 1C 1D 1E 1F 1G 1H 1I 1J

第四次 gap = 1 / 2 = 0 排序完成得到數組:
	4 13 26 27 38 49 49 55 65 97
 */

function shellsort($a) {
	$n = count($a);
	//gap 步長
	for ($gap = $n / 2; $gap > 0; $gap /= 2){
		//分組
		for ($i = $gap; $i < $n; $i++){
			//每組排序
			for ($j = $i - $gap; $j >= 0 && $a[$j] > $a[$j + $gap]; $j -= $gap){
				$tmp = $a[$j];
				$a[$j] =  $a[$j + $gap];
				$a[$j + $gap] = $tmp;
			}
		}
	}
	return $a;
}

$arr = [1,21,2,3,333,4,23];

$res = shellsort($arr);

print_r($res);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章