快速排序法
HTML5學堂-碼匠:前幾期「演算法之旅」跟大家分享了冒泡排序法和選擇排序法,它們都屬於時間複雜度為O(n^ 2)的「慢」排序。今天跟大家分享多種排序演算法裡使用較廣泛,速度快的排序演算法 —— 快速排序法 [ 平均時間複雜度為O (n logn) ]。
Tips 1:關於「演算法」及「排序」的基礎知識,在先前「選擇排序法」中已詳細講解,可點擊文後的相關文章連結查看,在此不再贅述。
Tips 2:如果沒有特殊說明,本文的快速排序是從小到大的排序。
快速排序法的原理
快速排序是一種分割交換排序,它採用分治的策略,通常稱之為分治法。
分治法
基本概念:將原問題分解為若干個規模較小但結構與原問題相似的子問題。遞歸地解決這些子問題,然後將這些子問題的結果組合成原問題的結果。
基本原理
從序列中任一個數字作為「基準」;
所有小於「基準」的數,都挪到「基準」的左邊;所有大於等於「基準」的數,都移到「基準」的右邊;
在這次移動結束之後,該「基準」就處於兩個序列的中間位置,不再參與後續的排序;
針對「基準」左邊和右邊的兩個子序列,不斷重複上述步驟,直到所有子序列只剩下一個數為止。
原理圖解
現有一個序列為 [8, 4, 7, 2, 0, 3, 1],如下示範快速排序法如何對其進行排序。
實現快速排序的步驟分解
選擇“基準”,並將其從原始數組分離
先取得基準的索引值,再使用splice數組方法取出基準值。
Tips:在此實例中, 基準的索引值 = parseInt(序列長度 / 2)
Tips:splice方法會改變原始陣列。例如,arr = [1, 2, 3]; 基準索引值為1,基準值為2,原始陣列變成arr = [1, 3];
遍歷序列,拆分序列
與「基準」比較大小,並拆分為兩個子序列
小於「基準」的數儲存於leftArr數組當中,大於等於「基準」的數儲存於rightArr數組當中
Tips:當然,也可以將小於等於「基準」的數存於leftArr,大於「基準」的數存於rightArr
由於要遍歷序列,將每一個數與「基準」進行大小比較,所以,需要藉助for語句來實現
#遞歸調用,遍歷子序列並組合子序列的結果
定義一個函數,形參用於接收陣列
function quickSort(arr) { };
實作遞歸呼叫遍歷子序列,用concat數組方法組合子序列的結果
判斷子序列的長度
遞歸呼叫的過程中,子序列的長度等於1時,則停止遞歸調用,返回目前數組。
快速排序法完整程式碼
#快速排序法的效率
時間複雜度
最壞情況:每一次選取的「基準」都是序列中最小的數/最大的數,這種情況與冒泡排序法類似(每次只能確定一個數[基準數]的順序),時間複雜度為O(n^2)
最好情況:每一次選取的「基準」都是序列中最中間的一個數(是中位數,而不是位置上的中間),那麼每次都把目前序列分成了長度相等的兩個子序列。這時候,第一次就有n/2、n/2兩個子序列,第二次就有n/4、n/4、n/4、n/4四個子序列,依此類推,n個數總共需要logn次才能排序完成(2^x=n,x=logn),然後每次都是n的複雜度,時間複雜度為O(n logn)
空間複雜度
最壞情況:需要進行n‐1 次遞歸調用,其空間複雜度為O(n)
最好情況:需要logn次遞歸調用,其空間複雜度為O(logn )
演算法的穩定性
快速排序是一種不穩定排序演算法
例如:現有序列為[1, 0, 1, 3],「基準」數字選擇為第二個1
在第一輪比較之後,變成了[0, 1, 1, 3],左序列為[0],右序列為[1, 3](右序列的1是先前的第一個1)
不難發現,原序列的兩個1的先後順序被破壞了,改變了先後順序,自然就是「不穩定」的排序演算法了
關於O
在先前的「冒泡排序法」一文當中,我們詳細講解過O是什麼,在此就不多說了,直接上圖吧
以上是如何實現快速排序的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Linux新版
SublimeText3 Linux最新版

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中