二分插入排序可以说是直接插入排序的升级版,对于数据量比较大的时候,二分插入排序可以有效的减少比较的次数,从而提高效率。
这里借助了二分的思想,但是需要注意的是,这个只是二分思想,和二分搜索并非一致,如果需要用到二分查询的话,前提必须是有序数据,但是这里只是借助了这个思想,把最靠近有序区的一个通过二分查找需要插入的位置,并且一次性移动所有大于目标数的所有元素。
| 12
 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);
 
 |