PHP排序算法

1、冒泡排序

/**
 * 冒泡排序
 * 先找出最大的放在最后面
 *
 * @param $arr
 *
 * @return mixed
 */
function bubbleSort($arr) {
    $length = count($arr);
    for ($i = 1; $i < $length; $i++) {
        for ($j = 0; $j < $length - $i; $j++) {
            if ($arr[$j] > $arr[$j + 1]) {
                $temp        = $arr[$j + 1];
                $arr[$j + 1] = $arr[$j];
                $arr[$j]     = $temp;
            }
        }
    }
    return $arr;
}

2、选择排序

/**
 * 选择排序
 * 先找出最小的放在最前面
 **/
function selectSort($arr) {
    //双重循环完成,外层控制轮数,内层控制比较次数
    $len = count($arr);
    for ($i = 0; $i < $len - 1; $i++) {
        //先假设最小的值的位置
        $p = $i;
        for ($j = $i + 1; $j < $len; $j++) {
            //$arr[$p] 是当前已知的最小值
            if ($arr[$p] > $arr[$j]) {
                //比较,发现更小的,记录下最小值的位置;并且在下次比较时采用已知的最小值进行比较。
                $p = $j;
            }
        }
        //已经确定了当前的最小值的位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。
        if ($p != $i) {
            $tmp     = $arr[$p];
            $arr[$p] = $arr[$i];
            $arr[$i] = $tmp;
        }
    }
    //返回最终结果
    return $arr;
}

3、插入排序

/**
 * 插入排序
 *
 * @param $arr
 *
 * @return mixed
 */
function insertSort($arr) {
    $len = count($arr);
    for ($i = 1; $i < $len; $i++) {
        $tmp = $arr[$i];
        //内层循环控制,比较并插入
        for ($j = $i - 1; $j >= 0; $j--) {
            if ($tmp < $arr[$j]) {
                //发现插入的元素要小,交换位置,将后边的元素与前面的元素互换
                $arr[$j + 1] = $arr[$j];
                $arr[$j]     = $tmp;
            } else {
                //如果碰到不需要移动的元素,由于是已经排序好是数组,则前面的就不需要再次比较了。
                break;
            }
        }
    }
    return $arr;
}

4、快速排序

function quickSort($a) {
    // 判断是否需要运行,因下面已拿出一个中间值,这里<=1
    if (count($a) <= 1) {
        return $a;
    }
    $middle = $a[0]; // 中间值
    $left   = []; // 接收小于中间值
    $right  = [];// 接收大于中间值
    // 循环比较
    for ($i = 1; $i < count($a); $i++) {

        if ($middle < $a[$i]) {

            // 大于中间值
            $right[] = $a[$i];
        } else {

            // 小于中间值
            $left[] = $a[$i];
        }
    }
    // 递归排序划分好的2边
    $left  = quickSort($left);
    $right = quickSort($right);
    // 合并排序后的数据,别忘了合并中间值
    return array_merge($left, [$middle], $right);
}

5、二分查找

function search($arr,$low, $high, $search) {
    $mid = intval(($low + $high) / 2);
    if ($arr[$mid] == $search) {
        return $mid;
    }
    if ($arr[$mid] > $search) {
        return searchTwo($low, $mid - 1, $search);
    }
    if ($arr[$mid] < $search) {
        return searchTwo($mid + 1, $high, $search);
    }
}

 

 

 

 

 

点赞