php排序算法

(一)冒泡排序

/**
 * 冒泡排序:
 * 使用相邻的元素挨个比较一次 符合条件交换位置
 * @param $arr
 */
function bubbleSort($arr)
{
    $length = count($arr);

    for ($i = 0; $i < $length - 1; $i++) { //控制轮数 length个数只需要比较length-1轮
        //控制每一轮的比较:并选出一个最大数
        //索引值应该是从0开始 --->到每一轮的倒数第二个结束 与其对应的后面一个元素进行比较
        //每一轮选出一个最大值以后 下一轮就少掉一个值 :
        //第一轮i=0,少0个;  j<arr.length-1-0
        //第二轮i=1,少1个;  j<arr.length-1-1
        //第三轮i=2,少2个   j<arr.length-1-2
        for ($j = 0; $j < $length - 1 - $i; $j++) {
            if ($arr[$j] > $arr[$j + 1]) {
                $temp        = $arr[$j];
                $arr[$j]     = $arr[$j + 1];
                $arr[$j + 1] = $temp;
            }
        }
    }
    return $arr;
}

(二)选择排序

/*
选择排序)
使用一个元素与其他元素挨个比较一次 如果符合条件则交换位置
*/
function selectSort($arr)
{
    $length = count($arr);
    //使用每个元素与其后面的所有元素挨个比较一次 符合条件则交换位置
    for ($i = 0; $i < $length - 1; $i++) {//被比较的数 从第一个到倒数第二个
        for ($j = $i + 1; $j < $length; $j++) {//要比较的其他所有数 从被比较的数后面一个开始 一直到最后一个数
            if ($arr[$i] > $arr[$j]) {
                $temp    = $arr[$i];
                $arr[$i] = $arr[$j];
                $arr[$j] = $temp;
            }
        }
    }
    return $arr;
}

 (三)快速排序

/**
 * 快速排序
 * 通过设置一个初始中间值,来将需要排序的数组分成3部分,小于中间值的左边,中间值,大于中间值的右边,
 * 继续递归用相同的方式来排序左边和右边,最后合并数组
 * @param $arr
 * @return array
 */
function quickSort($arr)
{
    // 如果个数为空或者1,则原样返回数组
    if (count($arr) <= 1) {
        return $arr;
    }

    $middle = $arr[0]; // 初始中间值

    $left  = array(); // 接收小于中间值
    $right = array();// 接收大于中间值

    // 循环比较
    for ($i = 1; $i < count($arr); $i++) {

        if ($arr[$i] > $middle) {

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

            // 小于或等于中间值
            $left[] = $arr[$i];
        }
    }

    // 递归排序划分好的2边
    $left  = quickSort($left);
    $right = quickSort($right);

    // 合并排序后的数据,别忘了合并中间值
    return array_merge($left, array($middle), $right);
}

 

posted @ 2018-12-18 18:13  佛系-Coder  阅读(244)  评论(0编辑  收藏  举报