-
Notifications
You must be signed in to change notification settings - Fork 700
/
insert.php
78 lines (74 loc) · 1.8 KB
/
insert.php
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?php
/**
* php算法实战.
*
* 排序算法-插入排序
*
* @author TIGERB <https://github.com/TIGERB>
*/
/**
* 插入排序.
*
* @param array $value 待排序数组
* @param integer $point 起始位置
*
* @return array
*/
function insert(&$value=[], $point=0)
{
if ($point >= count($value) - 1) {
return;
}
$next = $value[$point + 1]; // 下一个待插入值
// 从后向前遍历已排序数组
for ($i=$point; $i >= 0; --$i) {
// 如果当前已排序值大于 待插入值
// 把当前值后往后移动一位
// 继续向前遍历
if ($value[$i] > $next) {
$value[$i+1] = $value[$i];
// 如果到开头,自动到插入头位
if ($i === 0) {
$value[$i] = $next;
break;
}
continue;
}
// 如果,当前已排序值小于或等于 待插入值
// 则,在当前值后插入 当前待插入值
// 特殊:如果末尾值小于或等于待插入值 则当前值后插入本身
$value[$i+1] = $next;
break;
}
$point += 1;// 已排序末尾位置
// 递归
insert($value, $point);
return $value;
}
/**
* 插入排序 for循环版
*
* @param array $value 待排序数组
*
* @return array
*/
function insert_for($arr=array())
{
$len = count($arr);
for($i = 1; $i < $len; $i++) {
$base = $arr[$i];
for($j = $i - 1; $j >= 0; $j--) {
if ($base < $arr[$j]) {
$arr[$j + 1] = $arr[$j];
if ($j === 0) {
$arr[$j] = $base;
break;
}
continue;
}
$arr[$j + 1] = $base;
break;
}
}
return $arr;
}