<?php
set_time_limit(0);
//选择排序
function selectSort($arr) {
//双重循环完成,外层控制轮数,内层控制比较次数
$len=count($arr);
for($i=0; $i<$len-1; $i++) {
//先假设最小的值的位置
$p = $i;
for($j=$i+1; $j<$len; $j++) {
//$arr[$p] 是当前已知的最小值
if($arr[$p] > $arr[$j]) {
//比较,发现更小的,记录下最小值的位置;并且在下次比较时采用已知的最小值进行比较。
$p = $j;
}
}
//已经确定了当前的最小值的位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。
if($p != $i) {
$tmp = $arr[$p];
$arr[$p] = $arr[$i];
$arr[$i] = $tmp;
}
}
//返回最终结果
return $arr;
}
class Sort{
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+1],$arr[$j])=[$arr[$j],$arr[$j+1]];
}
}
}
return $arr;
}
//快速排序
public function QuickSort($arr)
{
//计算数组长度
$len=count($arr);
if($len<=1){
return $arr;
}
//定义一个基准数
//使用数组中第一个数作为基准数,这样可以保证数据都参与对比
$base_num = $arr[0];
$behind=[];//后
$before=[];//前
for($i=1;$i<$len;$i++){
if($arr[$i]>$base_num){
$behind[] = $arr[$i];
}
else{
$before[] = $arr[$i];
}
}
$right=$this->QuickSort($behind);
$left =$this->QuickSort($before);
//拼接数组
$res=array_merge($left,[$base_num],$right);
return $res;
}
//插入
function insertSort($arr) {
$len=count($arr);
for($i=1, $i<$len; $i++) {
$tmp = $arr[$i];
//内层循环控制,比较并插入
for($j=$i-1;$j>=0;$j--) {
if($tmp < $arr[$j]) {
//发现插入的元素要小,交换位置,将后边的元素与前面的元素互换
$arr[$j+1] = $arr[$j];
$arr[$j] = $tmp;
} else {
//如果碰到不需要移动的元素,由于是已经排序好是数组,则前面的就不需要再次比较了。
break;
}
}
}
return $arr;
}
//斐波那契
function f($a)
{
if ($a == 0 || $a == 1) {
return 1;
}
return f($a-1) + f($a-2);
}
//折半查找
public function BinSearch($arr,$start,$end,$search)
{
// if($end>=$start){
// $mid = ceil(($start+$end)/2);
// if($arr[$mid] ==$search){
// return $mid;
// }elseif($arr[$mid]>$search){
// return $this->BinSearch($arr,$start,$mid-1,$search);
// }else{
// return $this->BinSearch($arr,$mid+1,$end,$search);
// }
// }else{
// return false;
// }
//
if($end>=$start){
$mid=ceil(($end+$start)/2);
if($arr[$mid]==$search){
return $mid;
}
elseif($arr[$mid]>$search){
return $this->BinSearch($arr,$start,$mid-1,$search);
}
else{
return $this->BinSearch($arr,$mid+1,$end,$search);
}
}
else{
return false;
}
}
//求由5个不重复的数字组成的任意不重复三位数,编写一个类实现,列举出所有满足条件的三位数。
//1.考虑5个数字含有0的情况
//2.考虑不含0的情况
//3.输出所有满足条件的三位数,并统计个数
//4.只允许使用count数组
public function GetNum($data)
{
$len=count($data);
//定义结果空数组
$num=[];
// 取处第一个数
for($i=0;$i<$len;$i++){
//取出第二个数
if($data[$i]==0){
continue;
}
for($j=0;$j<$len;$j++){
//取出第三个数
for($m=0;$m<$len;$m++){
if($data[$i]==$data[$j]||$data[$i]==$data[$m]||$data[$j]==$data[$m]){
continue;
}
else{
//生成三位数
$num[]=$data[$i].$data[$j].$data[$m];
}
}
}
}
return $num;
}
//任意不重复五位数, 随机取出10000个 存入到文件中,每个文件能够存储1000个数字,
//要求能够快速地找到一数在不在我们的文件中 在文件中显示位置
public function Num()
{
//创建一个10000-99999的数组
$arr=range(10000,99999);
//打乱数组
shuffle($arr);
//截取数据
$brr=array_slice($arr,0,10000);
//排序
$brr=sort($brr);
// 分割为十份
$res=array_chunk($brr,1000);
return $res;
}
public function Search($str)
{
$res=$this->Num();
// 写入文件
foreach($res as $k => $v){
//将数组用空格连接起来
$str=implode("\n",$v);
//写入文件
file_put_contents('./texts/'.$k.'.txt' , $str);
}
return $res;
}
}
//实例化对象
$obj=new Sort();
//定义待排序数组
$data=[1,5,23,44,8,0,3,66,43];
//冒泡排序
// $res=$obj->BubbleSort($data);
//快速排序
// $res=$obj->QuickSort($data);
//获取不重复三位数
// $res=$obj->GetNum(array(2,5,9,7,1));
// $res=array_count_values($res);
//折半查找
// $res=$obj->BinSearch([1,2,3,4],0,3,4);
echo '<pre>';
var_dump($res);
// print_r($res);
?>