【算法】PHP实现经典算法(上)
前言
下面的是通过PHP实现经典算法,并计算了耗时,可以通过耗时对比这几种算法的复杂度。
CODE
$arr = [];for ($i = 0; $i < 5000; $i++) { $arr[] = rand(1, 10000);}//1 插入排序function insertionSort($arr){ for ($i = 1; $i < count($arr); $i++) { $tmp = $arr[$i]; //设置监视哨 $key = $i - 1; //设置开始查找的位置 while ($key >= 0 && $tmp < $arr[$key]) { // 监视哨的值比查找的值小 并且 没有到此次查询的第一个 $arr[$key + 1] = $arr[$key]; //数组的值进行后移 $key--; //要查找的位置后移 } if (($key + 1) != $i) //放置监视哨 $arr[$key + 1] = $tmp; } return $arr;}$insertion_start_time = microtime(true);$insertion_sort = insertionSort($arr);$insertion_end_time = microtime(true);$insertion_need_time = $insertion_end_time - $insertion_start_time;print_r("插入排序耗时:" . $insertion_need_time . "<br />");//2 冒泡排序function bubbleSort($arr){ for ($i = 0; $i < count($arr); $i++) { for ($j = 0; $j < $i + 1; $j++) { if ($arr[$j] < $arr[$j - 1]) { $temp = $arr[$j - 1]; $arr[$j - 1] = $arr[$j]; $arr[$j] = $temp; } } } return $arr;}$bubble_start_time = microtime(true);$bubble_sort = bubbleSort($arr);$bubble_end_time = microtime(true);$bubble_need_time = $bubble_end_time - $bubble_start_time;print_r("冒泡排序耗时:" . $bubble_need_time . "<br />");//3 选择排序function selectionSort($arr){ $count = count($arr); for ($i = 0; $i < $count - 1; $i++) { //找到最小的值 $min = $i; for ($j = $i + 1; $j < $count; $j++) { //由小到大排列 if ($arr[$min] > $arr[$j]) { //表明当前最小的还比当前的元素大 $min = $j; //赋值新的最小的 } } /*swap$array[$i]and$array[$min]即将当前内循环的最小元素放在$i位置上*/ if ($min != $i) { $temp = $arr[$min]; $arr[$min] = $arr[$i]; $arr[$i] = $temp; } } return $arr;}$selection_start_time = microtime(true);$selection_sort = selectionSort($arr);$selection_end_time = microtime(true);$selection_need_time = $selection_end_time - $selection_start_time;print_r("选择排序耗时:" . $selection_need_time . "<br />");//4 并归排序//merge函数将指定的两个有序数组(arr1arr2,)合并并且排序//我们可以找到第三个数组,然后依次从两个数组的开始取数据哪个数据小就先取哪个的,然后删除掉刚刚取过///的数据function al_merge($arrA, $arrB){ $arrC = array(); while (count($arrA) && count($arrB)) { //这里不断的判断哪个值小,就将小的值给到arrC,但是到最后肯定要剩下几个值, //不是剩下arrA里面的就是剩下arrB里面的而且这几个有序的值,肯定比arrC里面所有的值都大所以使用 $arrC[] = $arrA['0'] < $arrB['0'] ? array_shift($arrA) : array_shift($arrB); } return array_merge($arrC, $arrA, $arrB);}//归并排序主程序function al_merge_sort($arr){ $len = count($arr); if ($len <= 1) return $arr;//递归结束条件,到达这步的时候,数组就只剩下一个元素了,也就是分离了数组 $mid = intval($len / 2);//取数组中间 $left_arr = array_slice($arr, 0, $mid);//拆分数组0-mid这部分给左边left_arr $right_arr = array_slice($arr, $mid);//拆分数组mid-末尾这部分给右边right_arr $left_arr = al_merge_sort($left_arr);//左边拆分完后开始递归合并往上走 $right_arr = al_merge_sort($right_arr);//右边拆分完毕开始递归往上走 $arr = al_merge($left_arr, $right_arr);//合并两个数组,继续递归 return $arr;}$merge_start_time = microtime(true);$merge_sort = al_merge_sort($arr);$merge_end_time = microtime(true);$merge_need_time = $merge_end_time - $merge_start_time;print_r("并归排序耗时:" . $merge_need_time . "<br />");//5 快速排序function quickSort(&$arr){ if(count($arr)>1){ $k=$arr[0]; $x=array(); $y=array(); $_size=count($arr); for($i=1;$i<$_size;$i++){ if($arr[$i]<=$k){ $x[]=$arr[$i]; }elseif($arr[$i]>$k){ $y[]=$arr[$i]; } } $x=quickSort($x); $y=quickSort($y); return array_merge($x,array($k),$y); }else{ return$arr; }}$quick_start_time = microtime(true);$quick_sort = al_merge_sort($arr);$quick_end_time = microtime(true);$quick_need_time = $quick_end_time - $quick_start_time;print_r("快速排序耗时:" . $quick_need_time . "<br />");
耗时对比
插入排序耗时:1.2335460186005
冒泡排序耗时:2.6180219650269
选择排序耗时:1.4159741401672
并归排序耗时:0.17212891578674
快速排序耗时:0.16736888885498

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Alipay PHP ...

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

PHP 개발에서 견고한 원칙의 적용에는 다음이 포함됩니다. 1. 단일 책임 원칙 (SRP) : 각 클래스는 하나의 기능 만 담당합니다. 2. Open and Close Principle (OCP) : 변경은 수정보다는 확장을 통해 달성됩니다. 3. Lisch의 대체 원칙 (LSP) : 서브 클래스는 프로그램 정확도에 영향을 미치지 않고 기본 클래스를 대체 할 수 있습니다. 4. 인터페이스 격리 원리 (ISP) : 의존성 및 사용되지 않은 방법을 피하기 위해 세밀한 인터페이스를 사용하십시오. 5. 의존성 반전 원리 (DIP) : 높고 낮은 수준의 모듈은 추상화에 의존하며 종속성 주입을 통해 구현됩니다.

시스템이 다시 시작된 후 UnixSocket의 권한을 자동으로 설정하는 방법. 시스템이 다시 시작될 때마다 UnixSocket의 권한을 수정하려면 다음 명령을 실행해야합니다.

기사는 PHP 5.3에 도입 된 PHP의 LSB (Late STATIC BING)에 대해 논의하여 정적 방법의 런타임 해상도가보다 유연한 상속을 요구할 수있게한다. LSB의 실제 응용 프로그램 및 잠재적 성능

PHP 개발에서 PHP의 CURL 라이브러리를 사용하여 JSON 데이터를 보내면 종종 외부 API와 상호 작용해야합니다. 일반적인 방법 중 하나는 컬 라이브러리를 사용하여 게시물을 보내는 것입니다 ...

기사는 입력 유효성 검사, 인증 및 정기 업데이트를 포함한 취약점을 방지하기 위해 프레임 워크의 필수 보안 기능을 논의합니다.

phpstorm에서 CLI 모드를 디버그하는 방법은 무엇입니까? PHPStorm으로 개발할 때 때때로 CLI (Command Line Interface) 모드에서 PHP를 디버그해야합니다 ...
