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;
    }

  

 

posted @ 2020-07-03 16:31  星云惊蛰  阅读(85)  评论(0)    收藏  举报