php基本排序算法

版权声明:版权归作者所有 https://blog.csdn.net/qq_36772866/article/details/82941122

用PHP实现一个双向队列

<?php  
	// 2.用PHP实现一个双向队列
	class Deque{
		private $queue = array();//私有属性
		public function addFirst($item){
			// 在队列头部添加
			return array_unshift($this->queue, $item);
		}

		public function addLast($item){
			// 向队列尾部添加
			return array_push($this->queue, $item);
		}

		public function removeFirst(){
			// 删除队列中的第一个元素
			return array_shift($this->queue);
		}

		public function removeLast(){
			// 删除队列中的最后一个元素
			return array_pop($this->queue);
		}

		public function get(){
			return $this->queue;
		}
	}


	$dq = new Deque();
	var_dump( $dq->addFirst(['name'=>"ken"]) );
	var_dump( $dq->addFirst(['name'=>"ken"]) );
	var_dump( $dq->addFirst(['name'=>"ken"]) );
	var_dump($dq->addLast(["sex"=>"man"]));
	var_dump( $dq->get() );
?>

使对象可以像数组一样进行foreach循环

<?php  
	// 1.使对象可以像数组一样进行foreach循环,要求属性必须是私有。(Iterator模式的PHP5实现,写一类实现Iterator接口)
	class Test implements Iterator{
		private $item = array("id"=>1,"name"=>"php");
		public function rewind(){
			reset($this->item);
		}

		public function current(){
			return current($this->item);
		}

		public function key(){
			return key($this->item);
		}

		public function next(){
			return next($this->item);
		}

		public function valid(){
			return ($this->current()!==false);
		}
	}

	// 测试
	$t = new Test();
	var_dump($t->current());
	var_dump($t->key());
	var_dump($t->next());
	var_dump($t->valid());
	echo "<br/>";
	foreach($t as $k=>$v){
		echo $k, '----->' ,$v, '<br/>';
	}

	echo "<br/>";
	var_dump($t->current());
	var_dump($t->key());
	var_dump($t->next());
	var_dump($t->valid());
?>

冒泡排序

<?php  
	// 3.请使用冒泡排序法对以下一组数据进行排序10 2 36 14 10 25 23 85 99 45
	function bubble_sort(&$arr){
		for($i=0, $len=count($arr); $i<$len; $i++){
			for($j=1; $j<$len-$i; $j++){
				$temp = $arr[$j-1];
				$arr[$j-1] = $arr[$j];
				$arr[$j] = $temp;
			}
		}
	}

	$arr = [10, 2, 36, 14, 10, 25, 23, 8];
	bubble_sort($arr);

	print_r($arr);
?>

5.一群猴子排成一圈,按1,2,...,n依次编号。
然后从第1只开始数,数到第m只,把它踢出圈,
从它后面再开始数,再数到第m只,在把它踢出去...,
如此不停的进行下去,直到最后只剩下一只猴子为止,
那只猴子就叫做大王。要求编程模拟此过程,
输入m、n,输出最后那个大王的编号。(新浪)(小米)
方案一,使用php来模拟这个过程

<?php  
	// 5.一群猴子排成一圈,按1,2,...,n依次编号。
	// 然后从第1只开始数,数到第m只,把它踢出圈,
	// 从它后面再开始数,再数到第m只,在把它踢出去...,
	// 如此不停的进行下去,直到最后只剩下一只猴子为止,
	// 那只猴子就叫做大王。要求编程模拟此过程,
	// 输入m、n,输出最后那个大王的编号。(新浪)(小米)
	// 方案一,使用php来模拟这个过程

    function king($n,$m){

        $mokey = range(1, $n);

        $i = 0;        
        while (count($mokey) >1) {

            $i += 1;

            $head = array_shift($mokey);//一个个出列最前面的猴子

            if ($i % $m !=0) {                #如果不是m的倍数,则把猴子返回尾部,否则就抛掉,也就是出列

                array_push($mokey,$head);

            }            // 剩下的最后一个就是大王了

            return $mokey[0];

        }

    }    // 测试

    echo king(10,7);    

    // 方案二,使用数学方法解决

    function josephus($n,$m){

        $r = 0;        
        for ($i=2; $i <= $m ; $i++) {

            $r = ($r + $m) % $i;

        }        return $r+1;

    }    // 测试

    print_r(josephus(10,7));
?>

快速排序

<?php  
	// 4.写出一种排序算法(要写出代码),并说出优化它的方法
	// 快速排序法
	function partition(&$arr, $low, $high){
		$pivotkey = $arr[$low];
		while($low < $high){
			while($low < $high && $arr[$high] >= $pivotkey){
				$high--;
			}
			$temp = $arr[$low];
			$arr[$low] = $arr[$high];
			$arr[$high] = $temp;

			while($low < $high && $arr[$low] <= $pivotkey){
				$low++;
			}

			$temp = $arr[$low];
			$arr[$low] = $arr[$high];
			$arr[$high] = $temp;
		}
		return $low;
	}

	function quickSort(&$arr, $low, $high){
		if($low < $high){
			$pivot = partition($arr, $low, $high);
			quickSort($arr, $low, $pivot-1);
			quickSort($arr, $pivot+1, $high);
		}
	}

	/**
	 * 该算法是通过分治递归来实现的,
	 * 其效率很大程度上取决于参考元素的选择,
	 * 可以选择数组的中间元素,也可以随机得到三个元素,
	 * 然后选择中间的那个元素(三数中值法)。
	 * 另外还有一点,就是当我们在分割时,
	 * 如果分割出来的子序列的长度很小的话(小于5到20),
	 * 通常递归的排序的效率就没有诸如插入排序或希尔排序那么快了。
	 * 因此可以会去判断数组的长度,如果小于10的话,
	 * 直接用插入排序,而不再递归调用这个快速排序。
	 */
?>

写一个二维数组排序算法函数

<?php  
	// 6.写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数。
	//二维数组排序,$arr是数据,$keys是排序的健值,$order是排序规则,1是降序,0是升序
	function array_sort($arr,$keys,$order=0){    
		if(!is_array($arr)){        
			return false;
		}

    	$keysvalue=array();    
    	foreach($arr as $key => $val){

        	$keysvalue[$key] = $val[$keys];

    	}    
    	if($order == 0){

        	asort($keysvalue);

    	}else{

        	arsort($keysvalue);
		}

    	reset($keysvalue);    
    	foreach($keysvalue as $key => $vals){

        	$keysort[$key] = $key;
		}

    	$new_array=array();    
    	foreach($keysort as $key=> $val){
        	$new_array[$key]=$arr[$val];
    	} 

    	return$new_array;

}    //测试

    $person=array(        
    	array('id'=>2,'name'=>'zhangsan','age'=>23),        
    	array('id'=>5,'name'=>'lisi','age'=>28),        
    	array('id'=>3,'name'=>'apple','age'=>17)

    );

    $result = array_sort($person,'name',1);

    print_r($result);
?>

二分法查询

<?php  
	// 10.描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组(小米)
	 /**

     * 顺序查找

     * @param  array $arr 数组

     * @param   $k   要查找的元素

     * @return   mixed  成功返回数组下标,失败返回-1

     */

    function seq_sch($arr,$k){        
    	for ($i=0,$n = count($arr); $i < $n; $i++) {            
    		if ($arr[$i] == $k) {                
    			break;
            }

        }        
        if($i < $n){            
        	return $i;

        }else{            
        	return -1;
        }

    }    /**

     * 二分查找,要求数组已经排好顺序

     * @param  array $array 数组

     * @param  int $low   数组起始元素下标

     * @param  int $high  数组末尾元素下标

     * @param   $k     要查找的元素

     * @return mixed        成功时返回数组下标,失败返回-1

     */

    function bin_sch($array,$low,$high,$k){        
    	if ($low <= $high) {

            $mid = intval(($low + $high) / 2);            
            if ($array[$mid] == $k) {                
            	return $mid;

            } elseif ($k < $array[$mid]) {                
            	return bin_sch($array,$low,$mid - 1,$k);

            } else{                
            	return bin_sch($array,$mid + 1,$high,$k);

            }

        }        
        return -1;

    }    // 测试:顺序查找

    $arr1 = array(9,15,34,76,25,5,47,55);    
    echo seq_sch($arr1,47);//结果为6

 

    echo "<br />";    // 测试:二分查找

    $arr2 = array(5,9,15,25,34,47,55,76);    
    echo bin_sch($arr2,0,7,47);//结果为5
?>

猜你喜欢

转载自blog.csdn.net/qq_36772866/article/details/82941122