【DAY.8】PHP数据结构与算法_排序_希尔排序

希尔排序:基于插入排序基础上分治后的排序方法,将数组按照一定间隔分成若干组,分别进行插入排序,最后组合成一个总的分组,再进行一次插入排序,优点在于减少交换次数(不是每次都循环整个数组)。

   
   
  1. $arr = array(3,9,4,1,7,10,12,321,8,5,2,6);
  2. /**
  3. * [shellsort 希尔排序]
  4. * @param [type] $array [待排序数组]
  5. * @return [type] array [排序完成后数组]
  6. * 关键变量$m(组数,步长),$key(每组元素数量)
  7. */
  8. function shellsort($array){
  9. //初始获取数组长度$len,初始化$m,下面第次除2分组
  10. $len = $m = count($array);
  11. //最外层循环,每次对数组进行分组,直至只剩一个数组
  12. while($m>=2){
  13. //获取当前组数
  14. $m = floor($m/2);
  15. //获取当前组内元素个数
  16. $key = floor($len/$m);
  17. //循环对每组元素进行插入排序
  18. for($i=0;$i<$m;$i++){
  19. //对$i 组进行插入排序,$key个元素,关键点步长$m,插入排序不是按1,递加,而是按照步长$m递加
  20. for($j=1;$j<$key;$j++){
  21. $temp = $array[$i+$m*$j];
  22. for($k=$j;$k>0;$k--){
  23. if($temp>$array[$i+$m*($k-1)]){
  24. $array[$i+$m*$k] = $array[$i+$m*($k-1)];
  25. }else{
  26. break;
  27. }
  28. }
  29. $array[$i+$m*($k)] = $temp;
  30. }
  31. }
  32. }
  33. return $array;
  34. }
  35. print_r(shellsort($arr));


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值