php中的排序算法

<?php
/**
 * Created by PhpStorm.
 * User: leo
 * Date: 2017/11/6
 * Time: 21:05
 */
$num = array(3,4,1,2,6,9,5,8);
/**
 * @purpose 冒泡排序
 * @param array $value 待排序数组
 * @return array
 */
function bubble($value = [])
{
     $length = count($value) - 1;
    $value0 = array();
    //外循环
    for($j = 0;  $j < $length ; ++$j)
    {
        /**
         * @purpose 排序成功后减少无用搜索
         */
        if($value0 == $value)
        {
            return $value;
        }
        $value0 = $value;
        /**
         * @purpose 主要排序逻辑
         */
        //内循环
        for($i = 0;$i<$length; ++$i)
        {
            // 如果后一个值小于前一个值
            if($value[$i + 1] < $value[$i])
            {
                $tmp = $value[$i + 1];
                $value[$i+1] = $value[$i];
                $value[$i] = $tmp;
            }
        }
        //echo $j."
";

        //var_dump($value);exit();
       // print_r($value);
       // echo '
';
    }
    return $value;
}


//$res =bubble($num);
//print_r($res);

/***
 * @purpose 快速排序
 * @param array $arr 待排序数组
 * @return array  排序后的数组
 *
 */
function quick(array $arr)
{
    //判断参数是否是一个数组
    if(!is_array($arr))
    {
        return [];
    }
    //如果数组长度是一直接返回
    $length = count($arr);
    if(1 >= $length)
    {
        return $arr;
    }
    //如果存在多个数组元素,则开始排序
    $left = $right = array();
    //使用for循环进行遍历,把第一个元素当做比较的对象
    for($i = 1 ; $i < $length;$i++)
    {
        //判断当前元素大小
        if($arr[$i] < $arr[0])
        {
            $left[] = $arr[$i];
        }
        else
        {
            $right[] = $arr[$i];
        }
    }
    //递归调用
    $left = quick($left);
    $right = quick($right);
    //将所有结果合并
    return array_merge($left,array($arr[0]),$right);
}

//$res = quick($num);
//print_r($res);


/**
 * @purpose 选择排序
 * @purpose array $arr 待排序数组
 * @return array
 */
function select (array &$arr)
{
    /**
     * @desc 不断的寻找最小值作为基准
     */
    $length = count($arr) - 1;
    for($i = 0 ; $i < $length; $i++)
    {
        $point = $i;//最小值索引
        for($j = $i+1; $j<= $length;$j++)
        {
            if($arr[$point] > $arr[$j])
            {
                $point = $j;
            }
        }
        $tmp = $arr[$i];
        $arr[$i] = $arr[$point];
        $arr[$point] = $tmp;

    }
    return $arr;
}
//$res = select($num);
//print_r($res);

/**
 * @purpose 插入排序
 * @param array $arr
 * @return array
 */
function insert($arr=array())
{
    //区分 哪部分是已经排序好的
    //哪部分是没有排序的
      //找到其中一个需要排序的元素
      //这个元素 就是从第二个元素开始,到最后一个元素都是这个需要排序的元素
      //利用循环就可以标志出来
      //i循环控制 每次需要插入的元素,一旦需要插入的元素控制好了,
    //间接已经将数组分成了2部分,下标小于当前的(左边的),是排序好的序列
    $length = count($arr);
    for($i = 1 ; $i< $length;$i++)
    {
        //获得当前需要比较的元素值。
        $base = $arr[$i];
        //内层循环控制 比较 并 插入
        for($j=$i - 1 ; $j >= 0; $j--)
        {
            //$arr[$i];//需要插入的元素; $arr[$j];//需要比较的元素
            if($base < $arr[$j])
            {
                $arr[$j + 1] = $arr[$j] ;
                //将前面的数设置为 当前需要交换的数
                $arr[$j] = $base;
            }
            else
            {
                //如果碰到不需要移动的元素
                ////由于是已经排序好是数组,则前面的就不需要再次比较了。
                break;
            }

        }
    }
    return $arr;
}
//$res2 = insert($num);
//print_r($res2);

/**
 * @purpose 默写插入排序
 */
function insert2(Array $arr)
{
    $length = count($arr) - 1;
    for($i = 1; $i< $length; $i++)
    {
        $base = $arr[$i];
        for($j = $i-1;0 < $j;$j--)
        {
            if($base < $arr[$j])
            {
               $arr[$j+1] = $arr[$j];
                $arr[$j] = $base;
            }
            else
            {
                break;
            }
        }
        return $arr;

    }
}



$res2 = insert2([4,3,1]);
print_r($res2);

function select2(Array $arr)
{
    $length = count($arr) - 1;
    for($i = 0 ; $i < $length;$i++)
    {
        $point = $i;
        for($j = $i+1;$j < $length ;$j++)
        {
            if($arr[$point] > $arr[$j])
            {
                $point = $j;
            }
        }

        $tmp =  $arr[$i] ;
        $arr[$i] = $arr[$point];
        $arr[$point] = $tmp;

    }
    return $arr;
}

function quick2(Array $arr)
{
    if(1 >= count($arr))
    {
        return $arr;
    }
    $left = $right =[];
    for($i = 1;$i < count($arr) -1 ; $i++)
    {
        if($arr[$i] < $arr[0])
        {
            $left[] = $arr[$i];
        }
        else
        {
            $right[] = $arr[$i];
        }
    }
    quick($left);
    quick($right);
    return array_merge($left,array($arr[0]),$right);
}


原文地址:https://www.cnblogs.com/kite2356/p/7978429.html