/*
@author nange
@time 2017/11/27
@content 算法排序类 和 查找算法的类
*/
Class Sort{
/*
权限修饰符
public 公共的类内、外都可调用
private 私有的 只能类内调用
protected 受保护的 父类和子类可以调用
*/
/*
@parms $arr $array 需要排序的无序的数组
@return $arr $array 排序完的有序数组
@content 冒泡排序 时间复杂度O(n²); 空间复杂度O(n²)
@快速排序 时间复杂度O(n*㏒₂ⁿ)
*/
public function BubbleSort($arr)
{
$len = count($arr);
//控制循环的层数
for ($i=1;$i<$len;$i++) {
//控制循环的次数
for ($j=0;$j<$len-$i;$j++) {
//判断
if ($arr[$j]<$arr[$j+1]) {
list($arr[$j],$arr[$j+1]) = [$arr[$j+1],$arr[$j]];
}
}
}
return $arr;
}
/*
@content 快速排序
@parms $arr $array 需要排序的无序的数组
@return $arr $array 排序完的有序数组
*/
public function QuickSort($arr){
$len = count($arr); //数组长度
if($len <=1){
return $arr;
}
//首先找出一个标杆
$base = $arr[0];
//定义两个空数组
$left = [];
$right = [];
for ($i=1;$i<$len;$i++) {
if ($arr[$i] < $base) {
$left[] = $arr[$i];
} else {
$right[] = $arr[$i];
}
}
$left = $this->QuickSort($left);
$right = $this->QuickSort($right);
$arr = array_merge($left,[$base],$right);
return $arr;
}
/*
@content 选择排序
@params $arr array 一个需要排序的无序数组
@return $arr array 排序好的数组
*/
public function SelectSort($arr) {
$len = count($arr);
for ($i=0;$i<$len-1;$i++) {
$min = $i;
for ($j=$i+1;$j<$len;$j++) {
if($arr[$min] > $arr[$j]) {
$min = $j;
}
}
if($min != $i) {
list($arr[$i],$arr[$min]) = [$arr[$min],$arr[$i]];
}
}
return $arr;
}
/*
@content 插入排序
@params $arr array 有序数组插入一个新元素后的结果
@returnn $arr array 排好序的有序数组
*/
public function InsertSort($arr)
{
$len = count($arr);
for ($i=1;$i<$len;$i++) {
for ($j=$i-1;$j>=0;$j--) {
if ($arr[$j] > $arr[$j+1]) {
list($arr[$j+1],$arr[$j]) = [$arr[$j],$arr[$j+1]];
} else {
break;
}
}
}
return $arr;
}
/*
@content 二分查找递归实现方法
@params $arr array $k 一个排序的有序数组 和 要查找的数
@params $min int $k 键值的开始位置
@params $max int $k 键值的结束位置
@return $target 要查找的数
*/
public function BinaryRecursive($arr,$target,$min,$max)
{
$half = ceil(($min+$max)/2);
if ($arr[$half] > $target) {
return $this->BinaryRecursive($arr,$target,$min,$half-1);
} elseif ($arr[$half] < $target) {
return $this->BinaryRecursive($arr,$target,$half+1,$max);
} else {
return $half+1;
}
}
/*
@content 二分查找递归实现方法
@params $arr array $k 一个排序的有序数组 和 要查找的数
@params $min int $k 键值的开始位置
@params $max int $k 键值的结束位置
@return $target 要查找的数
*/
public function Binary($arr,$target,$min,$max)
{
while ($min<=$max) {
$half = ceil(($min+$max)/2);
if ($arr[$half] > $target) {
$max = $half-1;
} elseif ($arr[$half] < $target) {
$min = $half +1;
} else {
return $half;
}
}
return -1;
}
}
Class Homework
{
public function Getenum($arr) {
$len = count($arr);
$data = [];
if($len == 0 || !$arr){
return false; }
$num = 0;
for($i=0;$i<$len;$i++){
if($arr[$i]==0) continue;
for($j=0;$j<$len;$j++){
for($k=0;$k<$len;$k++){
if($arr[$i]!=$arr[$j] && $arr[$i]!=$arr[$k] && $arr[$j]!=$arr[$k]){
$num++;
if($num%10==0)
echo "<br>";
$data[] = $arr[$i].$arr[$j].$arr[$k]."\n";
}
}
}
}
return $data;
}
}