一、声明数组
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); } }
持续更新中............