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

php经典排序算法(解析)

时间:2023-03-29 19:09:49 PHP

介绍三种排序算法快速排序选择排序冒泡排序选择排序选择排序(Selectionsort)是一种简单直观的排序算法。其工作原理是每次从待排序的数据元素中选择最小(或最大)的元素,存储在序列的开头,直到所有待排序的数据元素都被排序完毕。选择排序是一种不稳定的排序方法(例如序列[5,5,3]第一次将第一个[5]和[3]交换,导致第一个5移动到第二个5后面)。简单解释首先,默认序列的第一个元素是最小值A,然后从剩余序列中选择最小值B,如果B$arr[$n+1]){$t=$arr[$n];$arr[$n]=$arr[$n+1];$arr[$n+1]=$t;}}}返回$arr;}quicksort(trueVerysoon)将待排序的数据通过one-pass排序分成独立的两部分,其中一部分的所有数据都小于另一部分的所有数据,然后对两部分数据进行快速排序按照这种方法,整个排序过程可以递归进行,从而使整个数据成为一个有序的序列。简单说明一下,这个真的比较抽象,因为就是把小的放一边,把大的放一边,然后递归出来codefunctionquickSort($arr){$len=count($arr);//因为是递归的,如果最后一个数组可能为空或者1,那么就不用比较了,直接returnif($len<=1){return$arr;}$base=$min=$max=[];$base_item=$arr[0];for($i=0;$i<$len;$i++){if($arr[$i]<$base_item){$min[]=$arr[$i];}elseif($arr[$i]>$base_item){$max[]=$arr[$i];}else{$base[]=$arr[$i];}}$min=quickSort($min);$max=快速排序($max);//每次构造一个新的序列returnarray_merge($min,$base,$max);}性能测试这三种排序算法的时间复杂度不同,我们来测试一下性能。我们使用以下代码生成哈希数组。$arr=范围(0,$argv[1]);shuffle($arr);然后执行以上三个方法$time=execTime();//快速排序quickSort($arr);$time=execTime($time);//选择排序selectSort($arr);$time=execTime($time);//冒泡排序bubbleSort($arr);$time=execTime($time);//这个计算毫秒比较耗时MethodfunctionexecTime($microTime=0){$microTime&&var_dump(microtime(true)*1000-$microTime);returnmicrotime(true)*1000;}看执行结果,最快的确实是快速排序phpsort_practice。php10float(0.0419921875)float(0.011962890625)float(0.011962890625)phpsort_practice.php100float(0.30908203125)float(0.396240234375)float(0.779052734375)phpsort_practice.php200float(0.687744140625)float(1.93994140625)float(3.37890625)phpsort_practice.php300float(0.85400390625)float(3.222900390625)float(8.123046875)phpsort_practice.php400float(1.23193359375)float(5.857177734375)float(11.824951171875)phpsort_practice.php500float(1.559814453125)float(8.73291015625)float(21.15087890625)phpsort_practice.php600float(1.70703125)浮动(14.300048828125)float(30.343994140625)phpsort_practice.php700float(2.265869140625)float(18.0390625)float(41.654052734375)phpsort_practice.php800float(2.581298828125)float(24.72998046875)float(53.56005859375)phpsort_practice.php900float(2.682861328125)float(31.9560546875)float(65.988037109375)phpsort_practice.php1000float(3.18701171875)float(36.010986328125)float(78.216064453125)phpsort_practice.php2000float(6.450927734375)float(151.62475585938)float(313.64624023438)phpsort_practice.php3000float(11.026123046875)float(362.6640625)float(721.11572265625)phpsort_practice.php4000float(15.346923828125)float(667.11791992188)float(1314.2221679688)phpsort_practice.php5000float(20.559814453125)float(1029.8937988281)float(2057.3466796875)phpsort_practice.php6000float(27.767822265625)float(1534.2431640625)float(2917.7407226562)phpsort_practice.php7000float(33.481201171875)float(2083.5861816406)float(3984.7060546875)phpsort_practice.php8000float(38.852783203125)float(2606.0270996094)float(5157.6708984375)phpsort_practice.php9000float(42.02587890625)float(3436.4509277344)float(6638.451171875)phpsort_practice.php10000float(45.932861328125)float(4640.3000488281)float(8474.2751464844)二分搜索查找再写一个经典搜索从中间开始,递归类似于快速排序$arr=range(0,$argv[1]);$value=mt_rand(0,count($arr));变量转储($值);函数binSearch($值,$arr){如果(!$arr){返回false;}$sign=floor(count($arr)/2);$middle=$arr[$sign];如果($middle==$value){var_dump($middle);}else{binSearch($value,array_slice($arr,0,$sign));binSearch($value,array_slice($arr,$sign+1));}}binSearch($value,$arr);