PHP的几种排序实现

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


?>

猜你喜欢

转载自blog.csdn.net/weixin_43665429/article/details/87902701
今日推荐