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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章