目錄
快速排序法
快速排序法的原理
分治法
基本原理
原理圖解
實現快速排序的步驟分解
選擇“基準”,並將其從原始數組分離
遍歷序列,拆分序列
#遞歸調用,遍歷子序列並組合子序列的結果
判斷子序列的長度
快速排序法完整程式碼
#快速排序法的效率
時間複雜度
空間複雜度
演算法的穩定性
關於O
首頁 web前端 js教程 如何實現快速排序的方法

如何實現快速排序的方法

Oct 09, 2017 am 10:12 AM
快速 排序 方法

快速排序法

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語句來實現

如何實現快速排序的方法 拆分序列

#遞歸調用,遍歷子序列並組合子序列的結果

定義一個函數,形參用於接收陣列

  1. 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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

微信刪除的人如何找回(簡單教學告訴你如何恢復被刪除的聯絡人) 微信刪除的人如何找回(簡單教學告訴你如何恢復被刪除的聯絡人) May 01, 2024 pm 12:01 PM

而後悔莫及、人們常常會因為一些原因不小心刪除某些聯絡人、微信作為一款廣泛使用的社群軟體。幫助用戶解決這個問題,本文將介紹如何透過簡單的方法找回被刪除的聯絡人。 1.了解微信聯絡人刪除機制這為我們找回被刪除的聯絡人提供了可能性、微信中的聯絡人刪除機制是將其從通訊錄中移除,但並未完全刪除。 2.使用微信內建「通訊錄恢復」功能微信提供了「通訊錄恢復」節省時間和精力,使用者可以透過此功能快速找回先前刪除的聯絡人,功能。 3.進入微信設定頁面點選右下角,開啟微信應用程式「我」再點選右上角設定圖示、進入設定頁面,,

怎麼在番茄免費小說app中寫小說 分享番茄小說寫小說方法教程 怎麼在番茄免費小說app中寫小說 分享番茄小說寫小說方法教程 Mar 28, 2024 pm 12:50 PM

番茄小說是一款非常熱門的小說閱讀軟體,我們在番茄小說中經常會有新的小說和漫畫可以去閱讀,每一本小說和漫畫都很有意思,很多小伙伴也想著要去寫小說來賺取賺取零用錢,在把自己想要寫的小說內容編輯成文字,那麼我們要怎麼樣在這裡面去寫小說呢?小伙伴們都不知道,那就讓我們一起到本站本站中花點時間來看寫小說的方法介紹。分享番茄小說寫小說方法教學  1、先在手機上打開番茄免費小說app,點擊個人中心——作家中心  2、跳到番茄作家助手頁面——點擊創建新書在小說的結

七彩虹主機板怎麼進入bios?教你兩種方法 七彩虹主機板怎麼進入bios?教你兩種方法 Mar 13, 2024 pm 06:01 PM

  七彩虹主機板在中國國內市場享有較高的知名度和市場佔有率,但是有些七彩虹主機板的用戶還不清楚怎麼進入bios進行設定呢?針對這一情況,小編專門為大家帶來了兩種進入七彩虹主機板bios的方法,快來試試吧!方法一:使用u盤啟動快捷鍵直接進入u盤裝系統七彩虹主機板一鍵啟動u盤的快捷鍵是ESC或F11,首先使用黑鯊裝機大師製作一個黑鯊U盤啟動盤,然後開啟電腦,當看到開機畫面的時候,連續按下鍵盤上的ESC或F11鍵以後將會進入到一個啟動項順序選擇的窗口,將遊標移到顯示“USB”的地方,然

手機版龍蛋孵化方法大揭密(一步一步教你如何成功孵化手機版龍蛋) 手機版龍蛋孵化方法大揭密(一步一步教你如何成功孵化手機版龍蛋) May 04, 2024 pm 06:01 PM

手機遊戲成為了人們生活中不可或缺的一部分,隨著科技的發展。它以其可愛的龍蛋形象和有趣的孵化過程吸引了眾多玩家的關注,而其中一款備受矚目的遊戲就是手機版龍蛋。幫助玩家們在遊戲中更好地培養和成長自己的小龍,本文將向大家介紹手機版龍蛋的孵化方法。 1.選擇合適的龍蛋種類玩家需要仔細選擇自己喜歡並且適合自己的龍蛋種類,根據遊戲中提供的不同種類的龍蛋屬性和能力。 2.提升孵化機的等級玩家需要透過完成任務和收集道具來提升孵化機的等級,孵化機的等級決定了孵化速度和孵化成功率。 3.收集孵化所需的資源玩家需要在遊戲中

手機字體大小設定方法(輕鬆調整手機字體大小) 手機字體大小設定方法(輕鬆調整手機字體大小) May 07, 2024 pm 03:34 PM

字體大小的設定成為了重要的個人化需求,隨著手機成為人們日常生活的重要工具。以滿足不同使用者的需求、本文將介紹如何透過簡單的操作,提升手機使用體驗,調整手機字體大小。為什麼需要調整手機字體大小-調整字體大小可以使文字更清晰易讀-適合不同年齡段用戶的閱讀需求-方便視力不佳的用戶使用手機系統自帶字體大小設置功能-如何進入系統設置界面-在在設定介面中找到並進入"顯示"選項-找到"字體大小"選項並進行調整第三方應用調整字體大小-下載並安裝支援字體大小調整的應用程式-開啟應用程式並進入相關設定介面-根據個人

快速掌握:華為手機開啟兩個微信帳號方法大揭密! 快速掌握:華為手機開啟兩個微信帳號方法大揭密! Mar 23, 2024 am 10:42 AM

在現今社會,手機已經成為我們生活中不可或缺的一部分。而微信作為我們日常溝通、工作、生活的重要工具,更是經常被使用。然而,在處理不同事務時可能需要分開兩個微信帳號,這就要求手機能夠支援同時登入兩個微信帳號。華為手機作為國內知名品牌,很多人使用,那麼華為手機開啟兩個微信帳號的方法是怎麼樣的呢?下面就來揭秘一下這個方法。首先,要在華為手機上同時使用兩個微信帳號,最簡

Go語言方法與函數的差異及應用場景解析 Go語言方法與函數的差異及應用場景解析 Apr 04, 2024 am 09:24 AM

Go語言方法與函數的差異在於與結構體的關聯性:方法與結構體關聯,用於操作結構體資料或方法;函數獨立於類型,用於執行通用操作。

Win11系統中「我的電腦」路徑有何不同?快速找方法! Win11系統中「我的電腦」路徑有何不同?快速找方法! Mar 29, 2024 pm 12:33 PM

Win11系統中「我的電腦」路徑有何不同?快速找方法!隨著Windows系統的不斷更新,最新的Windows11系統也帶來了一些新的變化和功能。其中一個常見的問題是使用者在Win11系統中找不到「我的電腦」的路徑,這在先前的Windows系統中通常是很簡單的操作。本文將介紹Win11系統中「我的電腦」的路徑有何不同,以及快速尋找的方法。在Windows1

See all articles