<面试> PHP 常见算法

排序算法

1. 冒泡排序(数组排序)  

  基本思想:对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换。这样每遍历一次,最小的数值就会被放置到数组的前面。

function bubble_sort($array) {
    $count = count($array);
    if ($count <= 0) {
        return false;
    }
    for ($i = 0; $i < $count; $i++) {
        // 内部没遍历一次 被遍历元素中最小的元素被放置到前面
        // 内部每次遍历元素的个数是之前一次的 -1 
        for ($j = $count - 1; $j > $i; $j--) {
            if ($array[$j] < $array[$j - 1]) {
                $temp = $array[$j];
                $array[$j] = $array[$j - 1];
                $array[$j - 1] = $temp;
            }
        }
    }
    return $array;
}

2. 快速排序

  基本思想:在数组中挑出一个元素(多为第一个)作为标尺,扫描一遍数组将比标尺小的元素排在标尺之前,将所有比标尺大的元素排在标尺之后,通过递归将各子序列分别划分为更小的序列直到所有的序列顺序一致

function quick_sort($arr)
{
    //先判断是否需要继续进行
    $length = count($arr);
    if ($length <= 1) {
        return $arr;
    }

    $base_num = $arr[0]; //选择一个标尺  选择第一个元素

    //初始化两个数组
    $left_array  = array(); //小于标尺的
    $right_array = array(); //大于标尺的
    for ($i = 1; $i < $length; $i++) {
        //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内
        if ($base_num > $arr[$i]) {
            //放入左边数组
            $left_array[] = $arr[$i];
        } else {
            //放入右边
            $right_array[] = $arr[$i];
        }
    }
    //再分别对 左边 和 右边的数组进行相同的排序处理方式
    //递归调用这个函数,并记录结果
    $left_array  = quick_sort($left_array);
    $right_array = quick_sort($right_array);
    //合并左边 标尺 右边
    return array_merge($left_array, array($base_num), $right_array);
}

 3. 选择算法

  基本思想:每次遍历选出最小的数,放在最前面

function SelectSort($arr) {
    $length = count($arr);
    if ($length <= 1) {
        return $arr;
    }
    for ($i = 0; $i < $length; $i++) {
        $min = $i;
        for ($j = $i + 1; $j < $length; $j++) {
            // 选出当前循环中最小数的索引 赋值给$min
            if ($arr[$j] < $arr[$min]) {
                $min = $j;
            }
        }
        if ($i != $min) {
            //如果最小数不是$i 则交换位置
            $tmp = $arr[$i];
            $arr[$i] = $arr[$min];
            $arr[$min] = $tmp;
        }
    }
    return $arr;
}
原文地址:https://www.cnblogs.com/xiaoliwang/p/9308082.html