当前位置: 首页 > 后端技术 > PHP

排序算法PHP版

时间:2023-03-30 03:14:56 PHP

策略类定义了一系列策略类,独立封装,遵循统一接口//抽象策略接口接口SortStrategy{publicfunctionsort($arr);}冒泡排序//具体策略类BubbleStrategyimplementsSortStrategy{publicfunctionsort($arr){$len=计数($arr);对于($i=0;$i<$len-1;$i++){$flag=true;对于($j=0;$j<$len-1-$i;$j++){如果($arr[$j]>$arr[$j+1]){list($arr[$j],$arr[$j+1])=数组($arr[$j+1],$arr[$j]);$标志=假;}}if($flag){中断;}}返回$arr;}}选择排序类SelectStrategy实现SortStrategy{publicfunctionsort($arr){$len=count($arr);对于($i=0;$i<$len-1;$i++){$minIndex=$i;对于($j=$i+1;$j<$len;$j++){如果($arr[$j]<$arr[$minIndex]){$minIndex=$j;}}if($minIndex!=$i){列表($arr[$i],$arr[$minIndex])=array($arr[$minIndex],$arr[$i]);}}返回$arr;}}插入排序类InsertStrategyimplementsSortStrategy{publicfunctionsort($arr){$len=count($arr);对于($i=1;$i<$len;$i++){$preIndex=$i-1;$nowVal=$arr[$i];while($preIndex>=0&&$arr[$preIndex]>$nowVal){$arr[$preIndex+1]=$arr[$preIndex];$preIndex--;}$arr[++$preIndex]=$nowVal;}返回$arr;}}希尔排序注意插入排序类ShellStrategy实现SortStrategy的区别{publicfunctionsort($arr){$len=count($arr);$差距=1;while($gap<$len/3){$gap=$gap*3+1;}for($gap;$gap>0;$gap=floor($gap/3)){for($i=$gap;$i<$len;$i++){$preIndex=$i-$gap;$nowVal=$arr[$i];while($preIndex>=0&&$arr[$preIndex]>$nowVal){$arr[$preIndex+$gap]=$arr[$preIndex];$preIndex-=$gap;}$arr[$preIndex+$gap]=$nowVal;}}返回$arr;}}归并排序classMergeStrategyimplementsSortStrategy{publicfunctionsort($arr){$len=count($arr);如果($len<2){返回$arr;}$mid=floor($len/2);$left=array_slice($arr,0,$mid);$right=array_slice($arr,$mid);返回$this->merge($this->sort($left),$this->sort($right));}privatefunctionmerge($left,$right){$res=[];while(count($left)>0&&count($right)>0){如果($left[0]<=$right[0]){$res[]=array_shift($left);}else{$res[]=array_shift($right);}}while(count($left)>0){$res[]=array_shift($left);}while(count($right)>0){$res[]=array_shift($right);}返回$res;}}快速排序类QuickStrategy实现SortStrategy{publicfunctionsort($arr){$len=count($arr);如果($len<2){返回$arr;}$mid=$arr[0];$左=[];$右=[];对于($i=1;$i<$len;$i++){如果($arr[$i]>$mid){$right[]=$arr[$i];}else{$left[]=$arr[$i];$left=$this->sort($left);$right=$this->sort($right);返回array_merge($left,[$mid],$right);}}堆排序类HeapStrategy实现SortStrategy{private$len=0;公共函数排序($arr){$this->len=count($arr);$this->buildMaxHeap($arr);对于($i=$this->len-1;$i>0;$i--){list($arr[0],$arr[$i])=array($arr[$i],$到达[0]);$this->len--;$this->heapify($arr,0);}返回$arr;}publicfunctionbuildMaxHeap(&$arr){for($i=floor($this->len/2)-1;$i>=0;$i--){$this->heapify($arr,$我);}}publicfunctionheapify(&$arr,$i){$left=2*$i+1;$right=2*$i+2;$bigIndex=$i;如果($left<$this->len&&$arr[$left]>$arr[$bigIndex]){$bigIndex=$left;}if($right<$this->len&&$arr[$right]>$arr[$bigIndex]){$bigIndex=$right;}if($bigIndex!=$i){list($arr[$bigIndex],$arr[$i])=数组($arr[$i],$arr[$bigIndex]);$this->heapify($arr,$大索引);}}}计数排序类CountingStrategy实现SortStrategy{publicfunctionsort($arr){$maxVal=max($arr);$minVal=min($arr);对于($i=$minVal;$i<=$maxVal;$i++){$bucket[]=0;}foreach($arras$v){$bucket[$v]++;}$新索引=0;while($newIndexsortStrategy=$sortStrategy;}publicfunctionasc($array){return$this->sortStrategy->sort($array);}}客户端通过给出不同的具体策略得到结果//客户端代码$arr=[9,8,7,6,5,4,3,2,1,0];$role=新Ro乐(新合并策略());$data=$role->asc($arr);$role=newRole(newQuickStrategy());$data=$role->asc($arr);设计模式仅使用来参考和理解其思想,在实践中,不同的策略类返回不同的结果

最新推荐
猜你喜欢