您的位置:首页 > 其它

自己整理的知识点 “算法排序和查找”

2017-11-28 19:16 246 查看
<?php 

/*

@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;

    }

}

 ?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: