zoukankan      html  css  js  c++  java
  • PHP 常用算法【总结】

    一、声明数组

    ini_set("max_execution_time", "12000");
    $arr = [2,4,1,7,33,4,5,6,7,11,1,0,60,22,44,51,2,92,8,999];
    $arr = array_rand((range(1,10000)),2000);
    shuffle($arr);

    二、算法

      1、泡排序 【对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换。 这样比较小(大)的数值就将逐渐从后面向前面移动。】

    function bubbleSort($arr, $sort='asc'){
    	
    	$sort = strtolower($sort);
    	if($sort!='asc' && $sort!='desc'){
    		return false;
    	}
    	$arr = array_values($arr);
    	$total = count($arr);
    	$operator = ( $sort=='asc' ? '>' : '<' );
    
    	for ($i=0; $i < $total; $i++) { 
    		for ($j=0; $j < ($total-1-$i); $j++) { 
    			$temp = $arr[$j];
    			if( eval( 'return ($arr[$j] '.$operator.' $arr[$j+1]);' ) ){
    				$arr[$j] = $arr[$j+1];
    				$arr[$j+1] = $temp;
    			}
    		}
    	}
    	return $arr;
    }
    

      

      

        2、快速排序【在数组中挑出一个元素(多为第一个)作为标尺,扫描一遍数组将比标尺小的元素排在标尺之前,将所有比标尺大的元素排在标尺之后,通过递归将各子序列分别划分为更小的序列直到所有的序列顺序一致。】

    function fastSort( $arr, $sort='asc'){
    
    	$length = count( $arr );
    	if($length<2){
    		return $arr;
    	}
    	$arr = array_values( $arr );
    	$ruler = $arr[0];	  //标尺
    	$left  = $right = []; //存标尺左右两边的数据
    	for ($i=1; $i < $length; $i++) { 
    		if( $arr[$i] > $ruler ){
    			$left[] = $arr[$i]; 	
    		}else{
    			$right[] = $arr[$i]; 	
    		}
    	}
    	//再分别对 左边 和 右边的数组进行相同的排序处理方式
    	//递归调用这个函数,并记录结果
    	$left = fastSort($left); 
    	$right = fastSort($right);
    	return array_merge( $left, array($ruler), $right) ;
    }
    

      

            3、二分查找【假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。(数据量大的时候使用)】

    /**
     * 二分查找法【排好序的,键值连续且无间断的】
     * @param  array  $arr   被搜索的数组
     * @param  string $key   要查找的值
     * @param  int    $start 数组第一个元素的下标
     * @param  int    $end   数组最后一个下标
     * @return int           要查找的值在数组里的key
     */
    function twoPointsSearch($arr, $key, $start, $end){
    
    	if($start>=$end || $start<0){
    		return false;
    	}
    	// 1、计算中间key值
    	$mid = (int) (( $start + $end ) / 2);
    	if( $arr[$mid]==$key ){
    		return $mid;
    	}elseif($arr[$mid]<$key){
    		return twoPointsSearch($arr, $key, $mid+1, $end);
    	}else{
    		return twoPointsSearch($arr, $key, $start, $mid-1);
    	}
    }
    

      

    持续更新中............

  • 相关阅读:
    01.html5+phonegap跨平台移动应用开发
    10个CSS简写/优化技巧
    JS高级学习历程-17
    JS高级学习历程-16
    算法详解之Tarjan
    分层图详解
    洛谷 题解 P1196 【[NOI2002]银河英雄传说】
    洛谷 题解 P1220 【关路灯 】
    洛谷 题解 P1352 【没有上司的舞会】
    二维前缀和详解
  • 原文地址:https://www.cnblogs.com/jxkshu/p/9555909.html
Copyright © 2011-2022 走看看