【PHP面試題】通俗易懂的兩個面試必問的排序演算法講解:冒泡排序和快速排序

来源:https://www.cnblogs.com/yaozhengqi/archive/2019/03/19/10562358.html
-Advertisement-
Play Games

又到了金三銀四找工作的時間,相信很多開發者都在找工作或者準備著找工作了。一般應對面試,我們無可厚非的去刷下麵試題。對於PHPer來說,除了要熟悉自己所做的項目,還有懂的基本的演算法。下麵來分享下PHP面試中常會問到的演算法:冒泡排序和快速排序 冒泡排序:一一對比排序 基本思想: 重覆地走訪過要排序的元素 ...


又到了金三銀四找工作的時間,相信很多開發者都在找工作或者準備著找工作了。一般應對面試,我們無可厚非的去刷下麵試題。對於PHPer來說,除了要熟悉自己所做的項目,還有懂的基本的演算法。下麵來分享下PHP面試中常會問到的演算法:冒泡排序和快速排序

 

冒泡排序:一一對比排序

基本思想:

重覆地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如從大到小)錯誤就把他們交換過來。走訪元素的工作是重覆地進行直到沒有相鄰元素需要交換,也就是說該元素已經排序完成。

 

圖解:

 

1.第一次:拿著數組的第一個元素,分別從第二個元素開始比較,如果前面的元素比後面的元素大,則交換兩個元素,得到較大的這個值,繼續向後比較,直到數組元素的最後,實現一次冒泡(冒泡一次,就得到當前“剩餘”數組的最大值,並且放到數組的“最後面”)

2.第二次開始,還是從第一個元素開始比較,但是只比較到數組長度要-1位置,並且每次的比較次數都依次-1

3.後面重覆比較,直到最後沒有需要一堆數字需要比較

代碼:

 1         $arr = array(3,2,6,0,1,4,7);
 2         //因為排序需要每次將一個元素與數組的其他元素進行比較,所以需要兩層迴圈來控制
 3         //外層迴圈控制冒泡次數
 4         //記憶體迴圈比較每次的大小,得到每次的最大值(泡)
 5  
 6         for($i = 0,$length = count($arr);$i < $length;$i++){
 7         
 8                  //記憶體迴圈
 9                  for($j = 0;$j < ($length - $i - 1);$j++){
10                          //拿著j變數所對應的數組元素,與後面的元素進行比較
11                          if($arr[$j] > $arr[$j + 1]){
12                                   //交換位置
13                                   $temp              = $arr[$j];
14                                   $arr[$j]           = $arr[$j+1];
15                                   $arr[$j+1]         = $temp;
16                          }
17                  }
18         }

總結:

冒泡排序最好的時間複雜度是O(n),雖然說它不是最優的演算法,但是這是我們經常接觸到的,面試也會給問到,所以我們一定要懂的基本原理,能理解到,能寫的出來

 

快速排序:用空間換時間

基本思想:

通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

圖解:

 

 

找到當前數組中的任意一個元素,作為標準,新建兩個空數組,遍歷整個數組元素,遍歷到的元素比當前元素要小,那麼放到左邊的數組;如果要大,放到另外一個數組中

遞歸思路

1.遞歸點:如果兩個數組的元素大於1,就需要再進行分解

2.遞歸出口:數組元素變成1的時候

代碼:

        
 1 //待排序數組
 2         $arr = array(5,3,8,2,6,4,7);
 3         //函數實現快速排序
 4         function quick_sort($arr){
 5                  //判斷參數是否是一個數組
 6                  if(!is_array($arr)) return false;
 7  
 8                  //遞歸出口:數組長度為1就直接返回數組
 9                  $length = count($arr);
10                  if($length <= 1) return $arr;
11 
12                  //數組元素有多個
13                  $left = $right = array();
14                  //使用for迴圈進行遍歷,把第一個元素當做比較的對象
15                  for($i = 1;$i < $length;$i++){
16                          //判斷當前元素值的大小
17                          if($arr[$i] < $arr[0]){
18                                   //當前元素小於標準元素,放到左邊數組
19                                   $left[] = $arr[$i];
20                          }else{
21                                   $right[] = $arr[$i];
22                          }
23                  }
24                  //遞歸調用
25                  $left = quick_sort($left);
26                  $right = quick_sort($right);
27  
28                  //將所有的結果合併
29                  return array_merge($left,array($arr[0]),$right);
30         }

總結:

快速排序在一般的排序的方式中最快的排序方式,以遞歸為基礎,使用空間換時間。在一般的面試中會給問到,要能知道基礎原理。

 

------------------------------------------------------------------------------

歡迎關註我的公眾號【phper的進階之路】,將不斷更新各種技術心得,免費提供各種學習資源!!!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 假設大家已經安裝好python的環境了。 Windows檢查是否可以運行python腳本 Ctrl+R 輸入 cmd 在命令行中輸入python 如果出現下麵結果,我們就可以開始python的學習了。 第一個python腳本 我使用的python自帶的python shell學習的代碼 打開的視窗如 ...
  • 跨域問題是由於瀏覽器為了防止CSRF攻擊(Cross-site request forgery跨站請求偽造),避免惡意攻擊而帶來的風險而採取的同源策略限制。當一個頁面中使用XMLHTTPRequest(XHR請求)對象發送HTTP請求時,必須保證當前頁面和請求的對象是同源的,即協議、功能變數名稱和埠號要完 ...
  • 使用python進行數據分析時,經常會用Pandas類庫處理數據,將數據轉換成我們需要的格式。Pandas中的有兩個數據結構和處理數據相關,分別是Series和DataFrame。 Series Series是一種類似於一維數組的對象,它有兩個屬性,value和index索引。可以像數組那樣通過索引 ...
  • 1 //幫我們創建容器 2 @RunWith(SpringJUnit4ClassRunner.class) 3 //指定創建容器時使用的配置文件 4 @ContextConfiguration("classpath:applicationContext.xml") 5 public class Te... ...
  • 背景人物介紹 “小明“,98後,9年義務教育比較“優秀”,沒考上大學,或者說沒勇氣參加高考,走的“單招”(你可能沒聽說過,就是高職學校的自主招生),一番努力下,考上了一所普通高職大專學生,高職學校一般為訂單培養,校企合作。大學3年努力一把,即將面臨畢業,6月份之前,需要找到工作! 就業範圍 北方人, ...
  • XML- XML(EXtensibleMarkupLanguage) - 官方文檔http://www.w3school.com.cn/xml/index.asp- 概念:父節點,子節點,先輩節點,兄弟節點,後代節點XPath- XPath(XML Path Language), 是一門在XML文檔 ...
  • 給定一個字元串 s 和一些長度相同的單詞 words。找出 s 中恰好可以由 words 中所有單詞串聯形成的子串的起始位置。註意子串要與 words 中的單詞完全匹配,中間不能有其他字元,但不需要考慮 words 中單詞串聯的順序。 示例 1:輸入: s = "barfoothefoobarman ...
  • 遇到用戶要根據下層物料反查最上層BOM物料是什麼。 試了一下,通過函數 CS_WHERE_USED_MAT 來查詢,但是只能往上查詢一層,類似事務碼CS15的效果。如果要找最上層物料,需要自己寫迭代進行查詢。 或者可以參考SAP程式 RCS15001,可以實現多級查詢。 ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...