php 四大排序和两个查找
快速排序
实现思路:把第一个元素作为标记,依次判断后续的值,如果小于它则放在左边,如果大于它则放右边,同理把左右两部分看成一个整体一直递归,最后再数组拼接起来
它的最优时间复杂度为O(nlogn)【以标记元素为中心,正好每次左右都能均匀分配】,最糟糕时间复杂度为O(n^2)【标记元素每次是最大或最小值,使所有数都划分到一边】
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
function quickSort($arr){ $count = count($arr); //统计出数组的长度 if ($count <= 1) { // 如果个数为空或者1,则原样返回数组 return $arr; } $index = $arr[0]; // 把第一个元素作为标记 $left = []; //定义一个左空数组 $right = []; //定义一个有空数组 for ($i = 1; $i < $count; $i++) { //从数组的第二数开始与第一个标记元素作比较 if ($arr[$i] < $index) { //如果小于第一个标记元素则放进left数组 $left[] = $arr[$i]; } else { //如果大于第一个标记元素则放进right数组 $right[] = $arr[$i]; } } $left = quickSort($left); //把left数组再看成一个新参数,再递归调用,执行以上的排序 $right = quickSort($right); //把right数组再看成一个新参数,再递归调用,执行以上的排序 return array_merge($left, [$arr[0]], $right); //最后把每一次的左数组、标记元素、右数组拼接成一个新数组}$arrtest=[12,43,54,33,23,14,44,53,10,3,56]; //测试数组$res=quickSort($arrtest); var_dump($res); |
冒泡排序
实现思路:每次从数组里面选出一个最大值,一直递归
它的最优时间复杂度为O(n)【正序,数组排好情况下】,最糟糕时间复杂度为O(n^2)【反序:数组排序刚好相反】
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
function bubbleSort($arr){ $count = count($arr); //统计出数组的长度 for ($i = 1; $i < $count; $i++) { //控制需要排序的轮数,该例子共需要比较10轮 $flag = 1;
for ($j = 0; $j < $count - $i; $j++) { //控制每一轮需要比较的次数,每轮选出最大的一个值放在最后 if ($arr[$j] > $arr[$j+1]) { $temp = $arr[$j]; //通过$temp介质把大的值放在后面 $arr[$j] = $arr[$j+1]; $arr[$j+1] = $temp; $flag = 0;
} } if($flag){
break; 打断不排序的
}
} return $arr; //返回最终结果}$arrtest=[12,43,54,33,23,14,44,53,10,3,56]; //测试数组$res=bubbleSort($arrtest); var_dump($res); |
选择排序 比冒泡快
$arr = [5, 2, 19, 29, 30,88,2,9];
$arr_count = count($arr);
for($i=0;$i<$arr_count-1;$i++){
$p=$i;//假设选择最小值
for($j=$i+1;$j<arr_count;$j++){
if($arr[$p] < $arr[$j]){
$p = $j;
}
}
if($p !=$i){
$temp = $arr[$p];
$arr[$p] = $arr[$i] ;
$arr[$i] = $temp;
}
}
插入排序 比选择排序快:
<?php
//插入排序
function insertSort(&$arr)
{
$count = count($arr); //计算排序元素个数
/**
* 第一层循环用于从未排序区域中取出待排序元素,并逐步缩小未排序区域,
* 第二层循环用于从已排序区域中寻找插入位置 *
*/
for ($i = 1; $i < $count; $i++)
{
//获得当前需要比较的元素值
$temp = $arr[$i];
//内层循环控制 比较 并 插入
for ($j = $i-1; $j >= 0; $j--)
{
/**
* $temp需要插入的元素;
* $arr[$j]需要比较的元素
*/
if($arr[$j] > $temp)
{
/**
* 发现插入的元素要小,交换位置
* 将后边的元素与前面的元素互换
*/
$arr[$j+1] = $arr[$j];
//将前面的数设置为当前需要交换的数
$arr[$j] = $temp;
}
else
{
/**
* 如果碰到不需要移动的元素
* 由于是已经排序好是数组,则前面的就不需要再次比较了。
*/
break;
}
}
}
//将这个元素 插入到已经排序好的序列内,返回
return $arr;
}
//调用插入排序实现元素排序
$arr = array(1,100,121,99,12);
insertSort($arr);
print_r($arr);
?>
顺序查找:foreach 正常查找
二分查找:表中元素按关键字有序排列
function quickSort($array, $low, $high, $target)
{
if ($low <= $high) {
$mid = intval(($low + $high) / 2);
if ($array[$mid] == $target) {
return $mid;
} elseif ($target < $array[$mid]) {
return $this->quickSort($array, $low, $mid-1, $target);
} else {
return $this->quickSort($array, $mid+1, $high, $target);
}
}
return false;
}

浙公网安备 33010602011771号