二分插入排序可以说是直接插入排序的升级版,对于数据量比较大的时候,二分插入排序可以有效的减少比较的次数,从而提高效率。
这里借助了二分的思想,但是需要注意的是,这个只是二分思想,和二分搜索并非一致,如果需要用到二分查询的话,前提必须是有序数据,但是这里只是借助了这个思想,把最靠近有序区的一个通过二分查找需要插入的位置,并且一次性移动所有大于目标数的所有元素。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
   | class BinSearch {     public function __invoke(array $args)     {         $length = count($args);
          for ($i = 1; $i < $length; $i++) {             $j   = $i - 1;             $k   = $args[$i];             $loc = $this->_binSearch($args, $k, 0, $j);
              while ($j >= $loc) {                 $args[$j + 1] = $args[$j];                 $j--;             }
              $args[$j + 1] = $k;         }
          return $args;     }
      public     function _binSearch(         $args,         $key,         $low,         $high     ) {         while ($low <= $high) {             $mid = ceil(($low + $high) / 2);
              if ($key > $args[$mid]) {                 $low = $mid + 1;             } else {                 $high = $mid - 1;             }         }
          return $low;     } }
  $data = [3, 5, 1, 2, 8, 6, 7, 9];
  $sort     = new BinSearch(); $sortData = $sort($data);
  print_r($sortData);
   |