PHP 排序总结

介绍由简入繁

$arr = [1, 5, 2, 7, 97, 23, 1, 4];

1.冒泡算法

function bubble_sort($arr)
{
    $count = count($arr);
    for ($i=1; $i < $count; $i++) { //循环次数
        for ($j=0; $j < $count-$i; $j++) {
            if ($arr[$j] > $arr[$j+1]) {
                $temp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $temp;
            }
        }
    }
    return $arr;
}

改进的冒泡排序

function new_bubble_sort($arr)
{
    $count = count($arr);
    $flag = false;   //作为标记,如果为false就不要交换
    for ($i=1; $i < $count && !$flag; $i++) { //循环次数
        $flag = true;
        for ($j=0; $j < $count-$i; $j++) {
            if ($arr[$j] > $arr[$j+1]) {
                $temp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $temp;
                $flag = false;
            }
        }
    }
    return $arr;
}

2.选择排序

function select_sort($arr)
{
    $count = count($arr);
    for ($i=0; $i < $count; $i++) {   // 排序的次数
        $min = $i;                  // 设置一个最小值的下标
        for ($j=$i+1; $j < $count; $j++) {
            if ($arr[$j] < $arr[$min]) {
                $min = $j;       // 如果有比最小值小的,交换下标
            }
        }
        if($min != $i) {            // 如果最小值的下标发生了改变,则交换
            $temp = $arr[$i];
            $arr[$i] = $arr[$min];
            $arr[$min] = $temp;
        }
    }
    return $arr;
}

3.插入排序 

function insert_sort($arr)
{
    $count = count($arr);
    for ($i=1; $i < $count; $i++) {
        $key = $arr[$i];           // 设置一个哨兵
        for ($j=$i; ($j > 0) && ($key < $arr[$j-1]); $j--) {
            $arr[$j] = $arr[$j-1];   //往后移,给被插数腾位置
        }
        $arr[$j] = $key;
    }
    return $arr;
}

4.希尔排序

改版的插入排序,突破了时间复杂度为o(n2)的瓶颈

function shell_sort($arr)
{
    $count = count($arr);
    $key = $count;        // 增量
    do {
        $key = floor($key/3)+1;
        for ($i=$key+1; $i < $count; $i++) {
            if ($arr[$i] < $arr[$i-$key]) {
                $temp = $arr[$i];
                for ($j=$i-$key; $j >0 && $temp<$arr[$j]; $j-=$key) {   // 改进的插入排序
                        $arr[$j+$key] = $arr[$j];
                }
                $arr[$j+$key] = $temp;
            }
        }
    } while ( $key > 1);
    return $arr;
} 

5.快速排序

function quickSort($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]) {
            //放入右边数组
            $right_array[] = $arr[$i];
        } else {
            //放入左边数组
            $left_array[] = $arr[$i];
        }
    }
    //再分别对左边和右边的数组进行相同的排序处理方式递归调用这个函数
    $left_array = quickSort($left_array);
    $right_array = quickSort($right_array);
    //合并
    return array_merge($left_array, array($base_num), $right_array);
}

6.堆排序

 

7.归并排序

 

8.基数排序

 

posted on 2018-03-19 13:08  bettyjones  阅读(112)  评论(0编辑  收藏  举报