PHP 排序演算法原理及總結
冒泡排序原理
原理描述:
一次比較兩個相鄰的元素,大的元素後移,小的元素前移(交換位置)。直到找出最大的元素。就像是氣泡一樣,大的向下沉,小的向上冒。
流程:
有一個無序陣列$arr = [8, 9, 3, 6, 1, 4]
第一次外循环 :找出最大值 9,要俩俩相比,比 5 次。 8 9 3 6 1 4 第一次, 8 跟 9 比,9 大,所以没有交换位置。 8 3 9 6 1 4 第二次, 9 跟 3 比, 9 大,交换位置。 8 3 6 9 1 4 第三次, 9 跟 6 比, 9 大,交换位置。 8 3 6 1 9 4 第四次, 9 跟 1 比, 9 大,交换位置。 8 3 6 1 4 9 第五次, 9 跟 4 比, 9 大,交换位置。 第二次外循环:找出第二大值 8,要俩俩相比,比 4 次。因为上一步已经找到最大值了。 3 8 6 1 4 9 第一次,8 跟 3 比,8 大, 交换位置。 3 6 8 1 4 9 第二次,8 跟 6 比,8 大, 交换位置。 3 6 1 8 4 9 第三次,8 跟 1 比,8 大, 交换位置。 3 6 1 4 8 9 第四次,8 跟 4 比,8 大, 交换位置。 第三次外循环:找出第三大的值 6,要俩俩相比,比三次。 3 6 1 4 8 9 第一次,3 跟 6 比,6 大,位置没有变化。 3 1 6 4 8 9 第二次,6 跟 1 比,6 大,交换位置。 3 1 4 6 8 9 第三次,6 跟 4 比,6 大,交换位置。 第四次外循环:找出第四大的值 4,要俩俩相比,比 2 次。 1 3 4 6 8 9 第一次, 3 跟 1 比, 3 大,交换位置。 1 3 4 6 8 9 第二次, 3 跟 4 比, 4 大,位置不变。 第五次外循环:找出第五大的值 3, 比一次就够了。 1 3 4 6 8 9 比一次。1 跟 3 比,3 大,位置没有变化。
總結:
1. 外層循環要元素數- 1次。負責找出最大值。
2. 內層循環逐層遞減一次。負責倆倆相比較,交換元素位置。
程式碼:
<?php function bubbleSort($arr) { $len = count($arr);//获取元素个数 for ($i = 0; $i < $len - 1; $i ++) {//找出最大值 $flag = 0;//做一个标记 for($j = 0; $j < $len - 1 - $i; $j++) {//俩俩相比较,交换位置 if ($arr[$j] > $arr[$j + 1]) { //$temp = $arr[$j];//存当前元素 //$arr[$j] = $arr[$j + 1];//把当前元素的值换成下一个元素的值 //$arr[$j + 1] = $temp;//把下一个元素的值换成上一个元素的值。 list($arr[$j], $arr[$j + 1]) = [$arr[$j + 1], $arr[$j]];//来自lovecn的评论,有时候思维有些固化。 $flag = 1;//交换位置就记录。 } } if ($flag == 0) {//没有发生交换位置,说明排序已经完成。可以推出循环。 break; } } return $arr; }
快速排序原理(遞歸)
原理描述:
從陣列中取第一個值作為參照物,比這個值小的放在左邊,比這個值大的放在右邊,這樣就會有兩個新的數組,遞歸處理兩個數組,然後左邊,參考物,右邊合併。注意:有遞歸就要找到遞迴出口,不然就會一直遞歸下去。
流程:
用文字敘述流程太麻煩,就從網路上找了一個圖片,過程很清晰。
#程式碼:
<?php function quickSort($arr) { $len = count($arr); //递归出口 if($len <= 1) { return $arr; } $markValue = $arr[0];//参照物。 $left = $right = [];//定义左边和右边。 for($i = 1; $i < $len; $i++) {//从1开始循环,因为第一个元素当作参照物。 if($arr[$i] > $markValue) {//大于参照物的放在右边。 $right[] = $arr[$i]; } else {//小于和等于参照物的元素都放进左边,这样会避免如果数组有重复元素时,会漏掉元素。 $left[] = $arr[$i]; } } return array_merge(quickSort($left), [$markValue], quickSort($right)); }
插入排序
原理描述:
#將要排序的數組分成兩個部分,取數組第一個元素放有序集合中,剩下的放到無序集合中。將需要排序的數,與前面已經排好序的資料從後往前比較,直到找到小於或等於它的數,使其插入到對應的位置。
我的記憶方法:
假設有兩個箱子,第一個箱子是透明並且是空的,要用來裝有序元素,第二個箱子是不透明並且是滿的,裝無序元素。 (其實裝什麼都行,你喜歡的讓你容易記得的最好)。
1.第一步:在不透明箱子裡隨便拿一個元素,直接丟到透明的箱子裡
2.第二步:再從不透明的箱子裡拿出一個元素,放進透明箱子裡前,做比較。如果大就放後面,如果小就放前面。
3.重複第二步,但我們每次需要比較的次數增加了,因為透明箱子裡元素多了,直到找到合適的位置。
流程:
<?php function insertSort($arr) { $len = count($arr); if ($len <= 1) {//一个元素或者没有元素,排序无意义。 return $arr; } for($i = 0; $i < $len - 1; $i++) { for($j = $i + 1; $j > 0; $j--){//每次比较次数增加。因为有序集合元素在增加。 if ($arr[$j] < $arr[$j - 1]) { list($arr[$j], $arr[$j - 1]) = [$arr[$j - 1], $arr[$j]];//交换位置。 } } } return $arr; }
選擇排序
原則描述:
每次一次從陣列中取出最小元素或最大元素,放到指定位置。
第一步:給第一個元素一個聖火令,和後面到每個元素比較,(我是取最小元素)。遇到比它小到元素就把這個聖火令給它,知道要把聖火令交給最小元素手裡。
第二步:交換位置,聖火令交給第二哥元素,重複第一步。
流程:
<?php function selectSort($arr) { $len = count($arr); if ($len <= 1) {//一个元素或者没有元素,排序没有意义。 return $arr; } for($i = 0; $i < $len - 1; $i++) { $p = $i;//给第一个元素圣火令。 for($j = $i + 1; $j < $len; $j++) { if ($arr[$j] < $arr[$p]) {//有圣火令的元素和后面的元素比较,把圣火令交给较小的元素。 $p = $j; } } list($arr[$p], $arr[$i]) = [$arr[$i], $arr[p]]; } return $arr; }
以上是PHP 排序演算法原理及總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。
