大飞_dafei

导航

PHP 常见4种排序 冒泡排序、选择排序、插入排序、快速排序

PHP 常见4种排序 冒泡排序、选择排序、插入排序、快速排序

1、冒泡排序

原理:对一组数据,比较相邻数的大小,将值大的放到后面。

<?php
// 冒泡排序
function bubbleOrder($arr)
{
    $count = count($arr);
    $temp = 0;
    // 外层控制排序次数
    for ($i = 0; $i < $count - 1; $i++) {
        // 内层控制每轮比较次数
        for ($j = 0; $j < $count - 1 - $i; $j++) {
            if ($arr[$j] > $arr[$j + 1]) {
                $temp = $arr[$j];
                $arr[$j] = $arr[$j + 1];
                $arr[$j + 1] = $temp;
            }   // print_r($arr);  echo "<br>";
        }
    }
    return $arr;
}

$arr = array(5, 2, 7, 6, 9, 3);
$res = bubbleOrder($arr);
var_dump($res);

2、选择排序

原理:在一组数据中,选出最小的数与第一个位置交换,
然后在剩下的数据中在找出最小的数和第二个位置交换
然后在剩下的数据中在找出最小的数和第三个位置交换
依次类推直到倒数第二个数和最后一个数对比

<?php
// 选择排序
function selcetOrder($arr)
{
    // 定义中间变量
    $temp = 0;
    $count = count($arr);
    for ($i = 0; $i < $count - 1; $i++) {
        //定义最小位置
        $minIndex = $i;
        for ($j = $i + 1; $j < $count; $j++) {
            if ($arr[$j] < $arr[$minIndex]) {
                $minIndex = $j;
            }
        }

        if ($i != $minIndex) {
            $temp = $arr[$i];
            $arr[$i] = $arr[$minIndex];
            $arr[$minIndex] = $temp;
        }
    }
    return $arr;
}

$arr = array(5, 2, 7, 6, 9, 3);
$res = selcetOrder($arr);
var_dump($res);

 

3、插入排序

原理: 将需要排序的书,与前面已经排好的数据从后往前进行比较,使其插入到相应的位置;

<?php
// 插入排序
function insertOrder($arr)
{
    $len = count($arr);
    //控制总循环次数
    for ($i = 0; $i < $len; $i++) {
        $temp = $arr[$i];
        for ($j = $i - 1; $j >= 0; $j--) {
            //从当前位置从后往前进行对比
            if ($temp < $arr[$j]) {
                $arr[$j + 1] = $arr[$j];
                $arr[$j] = $temp;
            }else{
                break;
            }
        }
    }
    return $arr;
}
$arr = array(5, 2, 7, 6, 9, 3);
$res = insertOrder($arr);
var_dump($res);

 

4、快速排序

原理:初始一个中间值(一般选择第一个),将需要排序的数组分成3部分,小于中间的值放左边、中间值、大于中间值的放右边,继续用递归用相同的方式来排序左边和右边,最后合并数组

<?php
// 快速排序
function quickOrder($arr)
{
    // 判断是否需要运行,下面要拿出一个中间值
    if (count($arr)<=1) {
        return $arr;
    }
    $middle = $arr[0]; // 中间值
    $left   = array();
    $right  = array();
    for ($i = 1; $i < count($arr); $i++) {
        if ($middle < $arr[$i]) {
            $right[] = $arr[$i];
        } else {
            $left[] = $arr[$i];
        }
    }
    // 递归排序划分好的2边数组
    $left = quickOrder($left);
    $right = quickOrder($right);
    return array_merge($left, array($middle), $right);
}
$arr = array(5, 2, 7, 6, 9, 3);
$res = quickOrder($arr);
var_dump($res)

 

;

 

posted on 2018-08-27 17:42  大飞_dafei  阅读(195)  评论(0编辑  收藏  举报