php算法
- 一、首先來畫個菱形玩玩,不少人學C時在書上都畫過,我們用PHP畫下,畫了一半。
思路:多少行for一次,而後在裏面空格和星號for一次。php
1
2
3
4
5
6
|
<?php
for
(
$i
=0;
$i
<=3;
$i
++){
echo
str_repeat
(
" "
,3-
$i
);
echo
str_repeat
(
"*"
,
$i
*2+1);
echo
'<br/>'
;
}
|
二、冒泡排序,C裏基礎算法,從小到大對一組數排序。html
思路:這題從小到大,第一輪排最小,第二輪排第二小,第三輪排第三小,依次類推……算法
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?php
$arr
=
array
(1,3,5,32,756,2,6);
$len
=
count
(
$arr
);
for
(
$i
=0;
$i
<
$len
-1;
$i
++){
for
(
$j
=
$i
+1;
$j
<
$len
;
$j
++){
if
(
$arr
[
$i
]>
$arr
[
$j
]){
//從小到大
$p
=
$arr
[
$i
];
$arr
[
$i
] =
$arr
[
$j
];
$arr
[
$j
]=
$p
;
}
}
}
var_dump(
$arr
);
|
三、楊輝三角,用PHP寫。shell
思路:每一行的第一位和最後一位是1,沒有變化,中間是前排一位與左邊一排的和,這種算法是用一個二維數組保存,另外有種算法用一維數組也能夠實現,一行 一行的輸出,有興趣去寫着玩下。數組
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1工具
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?php
//每行的第一個和最後一個都爲1,寫了6行
for
(
$i
=0;
$i
<6;
$i
++) {
$a
[
$i
][0]=1;
$a
[
$i
][
$i
]=1;
}
//出除了第一位和最後一位的值,保存在數組中
for
(
$i
=2;
$i
<6;
$i
++) {
for
(
$j
=1;
$j
<
$i
;
$j
++) {
$a
[
$i
][
$j
] =
$a
[
$i
-1][
$j
-1]+
$a
[
$i
-1][
$j
];
}
}
//打印
for
(
$i
=0;
$i
<6;
$i
++){
for
(
$j
=0;
$j
<=
$i
;
$j
++) {
echo
$a
[
$i
][
$j
].
' '
;
}
echo
'<br/>'
;
}
|
四、在一組數中,要求插入一個數,按其原來順序插入,維護原來排序方式。post
思路:找到比要插入數大的那個位置,替換,而後把後面的數後移一位。測試
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<?php
$in
= 2;
$arr
=
array
(1,1,1,3,5,7);
$n
=
count
(
$arr
);
//若是要插入的數已經最大,直接打印
if
(
$arr
[
$n
-1] <
$in
) {
$arr
[
$n
+1] =
$in
; print_r(
$arr
);
}
for
(
$i
=0;
$i
<
$n
;
$i
++) {
//找出要插入的位置
if
(
$arr
[
$i
] >=
$in
){
$t1
=
$arr
[
$i
];
$arr
[
$i
] =
$in
;
//把後面的數據後移一位
for
(
$j
=
$i
+1;
$j
<
$n
+1;
$j
++) {
$t2
=
$arr
[
$j
];
$arr
[
$j
] =
$t1
;
$t1
=
$t2
;
}
//打印
print_r(
$arr
);
die
;
}
}
|
五、對一組數進行排序(快速排序算法)。ui
思路:經過一趟排序分紅兩部分,而後遞歸對這兩部分排序,最後合併。url
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?php
function
q(
$array
) {
if
(
count
(
$array
) <= 1) {
return
$array
;}
//以$key爲界,分紅兩個子數組
$key
=
$array
[0];
$l
=
array
();
$r
=
array
();
//分別進行遞歸排序,而後合成一個數組
for
(
$i
=1;
$i
<
count
(
$array
);
$i
++) {
if
(
$array
[
$i
] <=
$key
) {
$l
[] =
$array
[
$i
]; }
else
{
$r
[] =
$array
[
$i
]; }
}
$l
= q(
$l
);
$r
= q(
$r
);
return
array_merge
(
$l
,
array
(
$key
),
$r
);
}
$arr
=
array
(1,2,44,3,4,33);
print_r( q(
$arr
) );
|
六、在一個數組查找你所需元素(二分查找算法)。
思路:以數組中某個值爲界,再遞歸進行查找,直到結束。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?php
function
find(
$array
,
$low
,
$high
,
$k
){
if
(
$low
<=
$high
){
$mid
=
intval
((
$low
+
$high
)/2);
if
(
$array
[
$mid
] ==
$k
){
return
$mid
;
}
elseif
(
$k
<
$array
[
$mid
]){
return
find(
$array
,
$low
,
$mid
-1,
$k
);
}
else
{
return
find(
$array
,
$mid
+1,
$high
,
$k
);
}
}
die
(
'Not have...'
);
}
//test
$array
=
array
(2,4,3,5);
$n
=
count
(
$array
);
$r
= find(
$array
,0,
$n
,5)
|
七、合併多個數組,不用array_merge(),題目來於論壇。
思路:遍歷每一個數組,從新組成一個新數組。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<?php
function
t(){
$c
= func_num_args()-1;
$a
= func_get_args();
//print_r($a);
for
(
$i
=0;
$i
<=
$c
;
$i
++){
if
(
is_array
(
$a
[
$i
])){
for
(
$j
=0;
$j
<
count
(
$a
[
$i
]);
$j
++){
$r
[] =
$a
[
$i
][
$j
];
}
}
else
{
die
(
'Not a array!'
);
}
}
return
$r
;
}
//test
print_r(t(range(1,4),range(1,4),range(1,4)));
echo
'<br/>'
;
$a
=
array_merge
(range(1,4),range(1,4),range(1,4));
print_r(
$a
);
|
八、牛年求牛:有一母牛,到4歲可生育,每一年一頭,所生均是同樣的母牛,到15歲絕育,再也不能生,20歲死亡,問n年後有多少頭牛。(來自論壇)
1
2
3
4
5
6
7
8
9
10
11
|
<?php
function
t(
$n
) {
static
$num
= 1
for
(
$j
=1;
$j
<=
$n
;
$j
++){
if
(
$j
>=4 &&
$j
<15) {
$num
++;t(
$n
-
$j
);}
if
(
$j
==20){
$num
--;}
}
return
$num
;
}
//test
echo
t(8);
|
====================其餘算法=========================
冒泡排序 (bubble sort) — O(n2)
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
|
$data
=
array
(3,5,9,32,2,1,2,1,8,5);
dump(
$data
);
BubbleSort(
$data
);
dump(
$data
);
function
BubbleSort(&
$arr
)
{
$limit
=
count
(
$arr
);
for
(
$i
=1;
$i
<
$limit
;
$i
++)
{
for
(
$p
=
$limit
-1;
$p
>=
$i
;
$p
--)
{
if
(
$arr
[
$p
-1] >
$arr
[
$p
])
{
$temp
=
$arr
[
$p
-1];
$arr
[
$p
-1] =
$arr
[
$p
];
$arr
[
$p
] =
$temp
;
}
}
}
}
function
dump(
$d
)
{
echo
'<pre>'
;
print_r(
$d
);
echo
'</pre>'
;
}
|
插入排序 (insertion sort)— O(n2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
$data
=
array
(6,13,21,99,18,2,25,33,19,84);
$nums
=
count
(
$data
)-1;
dump(
$data
);
InsertionSort(
$data
,
|