zoukankan      html  css  js  c++  java
  • PHP 希尔排序

    • 希尔排序平均时间复杂度O(n^1.3),最好情况O(n),最坏情况O(n^2)
     1 <?php
     2     #希尔排序
     3     function shellSort(Array $arr) {
     4         $k = initStep(count($arr));
     5         $step = pow(2, $k) - 1;
     6         #根据步长进行多次插入排序,依次减少步长,
     7         for(;$step >= 1; $step = pow(2, --$k) - 1) {
     8             $arr = insertSort($arr, $step);
     9         }
    10         return $arr;
    11     }
    12 
    13     #求希尔排序初始步长,初始步长公式为2^k<len,len为数组长度,k取最大值
    14     function initStep($len) {
    15         $k = 0;
    16         while(pow(2, $k) < $len) {
    17             $k++;
    18         }
    19         return $k - 1;
    20     }
    21 
    22     #指定部分数组元素按步长向后移动
    23     function move(Array $arr, $step, $start = null, $end = null) {
    24         if(!isset($start) || $start < 0) $start = 0;
    25         if(!isset($end) || $end >= count($arr)) $end = count($arr) - $step - 1;    #最后只能选到倒数第step+1个元素
    26         
    27         for($i = $end; $i >= $start; $i -= $step) {
    28             $arr[$i + $step] = $arr[$i];
    29         }
    30         return $arr;
    31     }
    32      
    33      #根据步长进行插入排序
    34     function insertSort(Array $arr, $step) {
    35         #进行step次插入排序
    36         for($i = 0; $i < $step; $i++) {
    37             #计算本组需要排到的最后一个元素
    38             $lastInx = $i;
    39             while($lastInx + $step < count($arr)) $lastInx += $step;
    40             
    41             #进行第i组排序
    42             for($j = $i + $step; $j <= $lastInx; $j += $step){#待排序元素从该组第二个元素开始
    43                 $insertEle = $arr[$j];    
    44                 for($k = $i; $k < $j; $k += $step) {
    45                     if($arr[$k] > $arr[$j]) {
    46                         $arr = move($arr, $step, $k, $j - $step);
    47                         $arr[$k] = $insertEle;
    48                         
    49                         break;
    50                     }
    51                 }
    52             }
    53         }
    54         return $arr;
    55     }
    56     
    57     $arr = array(5, 1, 7, 4, 6, 2, 9, 11, 54, 0);
    58     $arr = shellSort($arr);
    59     print_r($arr);
    60 ?>

    输出

    Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 4 [4] => 5 [5] => 6 [6] => 7 [7] => 9 [8] => 11 [9] => 54 )

  • 相关阅读:
    eventlet设计模式
    backbone Model调用save方法的时候提交方式
    django form POST方法提交表达
    wordpress简单搭建个人博客
    docker-py环境配置
    EditPlus安装与注册
    xmind安装和升级
    统计学习的相关定义
    LaTeX初识
    flask_mail发送邮件
  • 原文地址:https://www.cnblogs.com/zemliu/p/2643339.html
Copyright © 2011-2022 走看看