二分查找法也叫折半查找法
#二分查找
function binarySearch(Array $arr, $target) {
$low = 0;
$high = count($arr) - 1;
while($low <= $high) {
$mid = floor(($low + $high) / 2);
#找到元素
if($arr[$mid] == $target) return $mid;
#中元素比目标大,查找左部
if($arr[$mid] > $target) $high = $mid - 1;
#重元素比目标小,查找右部
if($arr[$mid] < $target) $low = $mid + 1;
}
#查找失败
return false;
}
$arr = array(1, 3, 5, 7, 9, 11);
$inx = binarySearch($arr, 1);
var_dump($inx);
1.冒泡排序
理解 $arr[0] 要与后面$a[1]到$[7] 比较 ,即数组的每一位都要后面剩下的下标元素比较,而不与前面下标的数组元素比较才能全部比较到
所以每一次循环次数都是 $arr[0] 需要比较 7 次 , $arra[1] 要比较 6次 ,所以 里面的for循环是 $num-$i-1;当然这是算循环次数,
不是程序真正运行的算法,按结果是一样的,数组中每个下标元素,都要与其他下标元素的比较到,
最简单的思考就是我们不管比较结果,只算比较次数,就好比下标就是篮子 里面有什么我们不管就是跟其他篮子比较,
结果给别人记录,比较那个人也给你排好顺序了,这就是比较最少次数,提高效率,比较容易理解
这个就好比一排人站成一队,只能跟身边的人两两从头到尾依次前小后大的原则互换
1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2、 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3、 针对所有的元素重复以上的步骤,除了最后一个。
4、 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
//1. 冒泡排序
$arr =[1,5,2,8,4,3,6,7];
bubbleSort($arr);
function bubbleSort($arr){
$num = count($arr);
for($i=0; $i
for($j=0; $j < $num-$i-1;$j++){
if($arr[$j] < $arr[$j+1]){
$tmp = $arr[$j];
$arr[$j] =$arr[$j+1] ;
$arr[$j+1] = $tmp;
}
}
}
print_r($arr);
}
2. 选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。
首先在未排序序列中找到最小元素,存放到排序序列的起始位置,
然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。
这个排序法就是,假设数组中第一元素是最小的开始,
然后跟后面元素比较、找出最小值放到这个位置,然后再假设第二个位置最小,以此类推;
这个就好比一排人站成一队,先随机选一个跟其他的比较选出最小的放到位置上,
$arr =[1,5,2,8,4,3,6,7];
selectSort($arr);
function selectSort($arr){
$len = count($arr);
//$len-1 是最后一个不用循环了
for($i=0;$i
$min_key = $i; //假设这个是最小值的下标
//$i+1 是因为跟下个下标元素比较 所以不能从$j=0开始
for($j=$i+1;$j
//取出最小值、再往下比较
if($arr[$min_key] > $arr[$j]){
//比较值,取最小值下标
$min_key = $j;
}
}
//循环完、就将最小的值取出来给$i 下标的元素
if($min_key != $i) {
$tmp = $arr[$min_key];
$arr[$min_key] = $arr[$i];
$arr[$i] = $tmp;
}
}
print_r($arr);
}
(2)选择排序变种(我自己写的没有排序的名字,感觉跟选择排序一个道理)
假设 数组的下标顺序就是想要的顺序,取相应的值按下标摆放 这个就好比一排人站成一队,从第一个开始出队跟剩下的人从头到尾 遇到小的就互换值;
$arr =[1,5,2,8,4,3,6,7];
changeSort($arr);
function changeSort($arr){
$len = count($arr);
//$len-1 是最后一个不用循环了
for($i=0;$i
$min_key = $i; //假设这个是最小值的下标
//$i+1 是因为跟下个下标元素比较 所以不能从$j=0开始
for($j=$i+1;$j
//取出最小值、再往下比较
if($arr[$i] > $arr[$j]){
//比较值,遇到小的就互换值
list($arr[$i],$arr[$j]) = array($arr[$j],$arr[$i]);//list()=array();数组为变量赋值
}
}
//循环完、就将最小的值取出来给$i 下标的元素
}
print_r($arr);
}
3.插入排序法
(1)、从第一个元素开始,该元素可以认为已经被排序
(2)、取出下一个元素,在已经排序的元素序列中从后向前扫描
(3)、如果该元素(已排序)大于新元素,将该元素移到下一位置
(4)、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
(5)、将新元素插入到该位置中
(6)、重复步骤2
第一个数组元素已被排好序,下标为0 , 把剩下的元素依据下个下标、拿出来跟它比,值比他小就换下位置,站入列队中,小在前大在后
一队人 第一个一站好 ,剩下的按小的在前,大的在后依次插入
$arr =[1,5,2,8,4,3,6,7];
insertSort($arr);
function insertSort($arr){
$len =count($arr);
for($i=1 ;$i
$tmp = $arr[$i];
for($j=$i-1;$j>=0;$j--){
//跟排好序的比,比最大的都大那就跳出不比了,直接入队,若小则在跟前面的比较
if($tmp >=$arr[$j]){
break;
}else{
$arr[$j+1] = $arr[$j];
$arr[$j] = $tmp;
}
}
}
print_r($arr);
}
4.快速排序(跟二叉树很像)
好比一队人分小组站好队,在集体加入队列站队 , 小的在左面,大的在右面
1、从数列中挑出一个元素,称为 “基准”(pivot),
2、重新排序数列,所有元素比基准值小的摆放在基准前面,
所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。
在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3、递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
$arr =[1,5,2,8,4,3,6,7];
print_r(quickSort($arr));
function quickSort($arr){
$left=$right=array();
$len = count($arr);
if($len <= 1) return $arr;
for($i=1;$i
if($arr[$i] < $arr[0]){
$left[] = $arr[$i];
}else{
$right[]=$arr[$i];
}
}
$left = quickSort($left);
$right =quickSort($right);
return array_merge($left,array($arr[0]),$right);
}
5.二叉树(这是一个简单的二叉树)
class tree{
public $root;
public $left;
public $right;
}
function to_array($obj){
$print_arr=array();
$tmp_arr = array();
array_unshift($tmp_arr,$obj);
while(!empty($tmp_arr)){
$data = array_pop($tmp_arr);
$print_arr[] = $data->root;
if($data->left !=null){
array_unshift($tmp_arr,$data->left);
}
if($data->right !=null){
array_unshift($tmp_arr,$data->right);
}
}
return $print_arr;
}
$root = new tree();
$node1 = new tree();
$node2 = new tree();
$node3 = new tree();
$node4 = new tree();
$node5 = new tree();
$node6 = new tree();
$root->root = 1;
$node1->root = 2;
$node2->root = 3;
$node3->root = 4;
$node4->root = 5;
$node5->root = 6;
$node6->root = 7;
$root->left = $node1;
$root->right = $node2;
$node1->left = $node3;
$node1->right = $node4;
$node2->left = $node5;
$node2->right = $node6;
echo "
";
print_r($root);
$traverse = to_array($root);
print_r($traverse);
注释:以上这些是我自己学习用的,不太权威哟,错了不管哟