<?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);
}