關於常用到的幾個排序,php的實現

技術小美發表於2017-11-08
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<?php
$arr array(20,4,2,-1,-34,0,50,6,19);
#氣泡排序
function bubbleSort($arr){
$flag = 0;
for($i=0;$i<count($arr)-1;$i++){
for($j=0;$j<count($arr)-1-$i;$j++){
if($arr[$j] > $arr[$j+1]){
$temp $arr[$j+1];
$arr[$j+1] = $arr[$j];
$arr[$j] = $temp;
$flag = 1;
}
}
//優化
if(!$flag){
//已經有序
break;
}
$flag=0;
}
return $arr;
}
echo implode(`,`,bubbleSort($arr)).`<br>`;
#選擇排序
function selectSort($arr){
for($i=0;$i<count($arr)-1;$i++){
//假設$i就是最小的
$minVal $arr[$i];
//$i是最小的下標
$minIndex $i;
for($j=$i+1;$j<count($arr);$j++){
//假設錯誤
if($minVal $arr[$j]){
$minVal $arr[$j];
$minIndex $j;
}
}
//最後交換
$temp $arr[$i];
$arr[$i] = $arr[$minIndex];
$arr[$minIndex] = $temp;
}
return $arr;
}
echo implode(`,`,selectSort($arr)).`<br>`;
#插入排序
function insertSort($arr){
//先預設下標為0的已經是有序的
for($i=1;$i<count($arr);$i++){
//準備插入的資料
$insertVal $arr[$i];
//待比較的下標,也就是前面的
$insertIndex $i-1;
//如果滿足下面條件,說明位置還未找到
while($insertIndex>=0&&$insertVal<$arr[$insertIndex]){
//同時把數後面移動一下
$arr[$insertIndex+1] = $arr[$insertIndex];
$insertIndex--;
}
//插入
$arr[$insertIndex+1] = $insertVal;
}
return $arr;
}
echo implode(`,`,insertSort($arr)).`<br>`;
#快速排序(遞迴)
function quickSort($left,$right,&$arr){
$l $left;
$r $right;
$pivot $arr[($left+$right)/2];
$temp=0;
while($l<$r){
while($arr[$l]<$pivot)$l++;
while($arr[$r]>$pivot)$r--;
if($l>=$rbreak;
$temp=$arr[$l];
$arr[$l]=$arr[$r];
$arr[$r]=$temp;
if($arr[$l]==$pivot)--$r;
if($arr[$r]==$pivot)++$l;
}
if($l==$r){
$l++;
$r--;
}
if($left<$r) quickSort($left,$r,$arr);
if($right>$l)quickSort($l,$right,$arr);
//return $arr;
}
quickSort(0,count($arr)-1,$arr);
echo implode(`,`,$arr).`<br>`;
#二分查詢
function binarySearch(&$arr,$findVal,$l,$r){
//停止條件
if($l>$r){
return;
}
//找到中間的下標
$midIndex round(($r+$l)/2);
if($findVal>$arr[$midIndex]){
binarySearch($arr,$findVal,$midIndex+1,$r);
}elseif($findVal<$arr[$midIndex]){
binarySearch($arr,$findVal,$l,$midIndex-1);
}else{
echo $midIndex;
}
}
binarySearch($arr,0,0,count($arr)-1);

都已經親自測試過,可以正常執行!

 

 

本文轉自shayang8851CTO部落格,原文連結:http://blog.51cto.com/janephp/1287597,如需轉載請自行聯絡原作者


相關文章