算法之旅 | 快速排序法

HTML5學堂-碼匠:前幾期“算法之旅”跟大家分享了冒泡排序法和選擇排序法,它們都屬于時間復雜度為O(n^2)的“慢”排序。今天跟大家分享多種排序算法里使用較廣泛,速度快的排序算法
—— 快速排序法 [ 平均時間復雜度為O (n logn) ]。

Tips 1:關于“算法”及“排序”的基礎知識,在此前“選擇排序法”中已詳細講解,可點擊文后的相關文章鏈接查看,在此不再贅述。
Tips 2:如果無特殊說明,本文的快速排序是從小到大的排序。

快速排序法的原理

快速排序是一種劃分交換排序,它采用分治的策略,通常稱其為分治法

分治法

基本思想:將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞歸地解決這些子問題,然后將這些子問題的結果組合成原問題的結果。

基本原理

從序列中任選一個數作為“基準”;
所有小于“基準”的數,都挪到“基準”的左邊;所有大于等于“基準”的數,都挪到“基準”的右邊;
在這次移動結束之后,該“基準”就處于兩個序列的中間位置,不再參與后續的排序;
針對“基準”左邊和右邊的兩個子序列,不斷重復上述步驟,直到所有子序列只剩下一個數為止。

原理圖解

現有一個序列為 [8, 4, 7, 2, 0, 3, 1],如下演示快速排序法如何對其進行排序。

clipboard.png

實現快速排序的步驟分解

選擇“基準”,并將其從原始數組分離

先獲取基準的索引值,再使用splice數組方法取出基準值。

clipboard.png

Tips:該實例中, 基準的索引值 = parseInt(序列長度 / 2)
Tips:splice方法會改變原始數組。例如,arr = [1, 2, 3]; 基準索引值為1,基準值為2,原始數組變為arr = [1, 3];

遍歷序列,拆分序列

與“基準”比較大小,并拆分為兩個子序列
小于“基準”的數存儲于leftArr數組當中,大于等于“基準”的數存儲于rightArr數組當中

clipboard.png

Tips:當然,也可以將 小于等于“基準”的數存于leftArr,大于“基準”的數存于rightArr
由于要遍歷序列,將每一個數與“基準”進行大小比較,所以,需要借助for語句來實現

clipboard.png

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

定義一個函數,形參用于接收數組

function quickSort(arr) { };

實現遞歸調用遍歷子序列,用concat數組方法組合子序列的結果

clipboard.png

判斷子序列的長度

遞歸調用的過程中,子序列的長度等于1時,則停止遞歸調用,返回當前數組。

clipboard.png

快速排序法完整代碼

clipboard.png

快速排序法的效率

時間復雜度

最壞情況:每一次選取的“基準”都是序列中最小的數/最大的數,這種情況與冒泡排序法類似(每一次只能確定一個數[基準數]的順序),時間復雜度為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是什么,在此就不多說了,直接上圖吧

clipboard.png

相關文章鏈接

算法之旅 | 選擇排序法
算法之旅 | 冒泡排序法

開開心心每一天

生活艱辛,代碼不易,但,不要忘記微笑!

clipboard.png


圖片描述

clipboard.png

clipboard.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394032.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394032.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394032.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

springmvd接收參數問題

問題描述: 好久不寫博客了,今天遇到一個問題,那就是post請求時,參數接收不到,當時我很納悶,看代碼: 就是這樣幾個參數,我使用postman請求時無法獲取參數: 報錯信息&#…

figma下載_如何在Figma中創建逼真的3D對象

figma下載by Gbolahan Taoheed Fawale通過Gbolahan Taoheed Fawale 如何在Figma中創建逼真的3D對象 (How to create realistic 3D objects in Figma) Prior to using Figma, I used Adobe Illustrator for most of my designs (like logos, mockups, illustrations, and so on…

OpenGL中的二維編程——從簡單的矩形開始

一、OpenGL的組成 圖元函數(primitive function)指定要生成屏幕圖像的圖元。包括兩種類型:可以在二維、三維或者四維空間進行定義的幾何圖元,如多邊形;離散實體;位圖。屬性函數(attribute funct…

圓與平面的接觸面積_如果一個絕對的圓放在絕對的平面上,接觸面是不是無限小?...

這種問題其實并不難解答:如果你真的能找到一個絕對的圓還有一個絕對平的平面上,并且保證放上去之后圓和平面不會有任何變化,那么接觸面就可以是無限小!如果不能,很抱歉,接觸面很顯然就不會是無限小&#xf…

leetocde1129. 顏色交替的最短路徑(bfs)

在一個有向圖中,節點分別標記為 0, 1, …, n-1。這個圖中的每條邊不是紅色就是藍色,且存在自環或平行邊。 red_edges 中的每一個 [i, j] 對表示從節點 i 到節點 j 的紅色有向邊。類似地,blue_edges 中的每一個 [i, j] 對表示從節點 i 到節點…

第38天:運算符、字符串對象常用方法

一、運算符 一元操作符 &#xff0c; --&#xff0c; &#xff0c; - 5 -6 邏輯操作符 !&#xff0c; &&&#xff0c; || 基本運算符 , -, *, /, % 關系操作符 >, <, >, <, , , !, ! 賦值 判斷 全等 條件操作符 &#xff08;三…

Redux Todos Example

此項目模板是使用Create React App構建的&#xff0c;它提供了一種簡單的方法來啟動React項目而無需構建配置。 使用Create-React-App構建的項目包括對ES6語法的支持&#xff0c;以及幾種非官方/尚未最終形式的Javascript語法 先看效果 這個例子可以幫助你深入理解在 Redux 中 …

有效電子郵件地址大全_如何優雅有效地處理介紹電子郵件

有效電子郵件地址大全by DJ Chung由DJ Chung 如何優雅有效地處理介紹電子郵件 (How to handle intro emails gracefully and effectively) 您想幫個忙時不想忘恩負義... (You don’t want to sound ungrateful when asking for a favor…) Let me tell you the story that ins…

notability錄音定位_Notability的一些使用技巧?

作為使用了一年Notability的考研狗 今天也來回答回答這個問題&#xff0c;希望可以給考研的同學一點點幫助。這個軟件的優點估計大家都知道&#xff0c;我在這里就不多說了。好吧&#xff0c;還有一個原因是我比較懶&#xff01;好了不多說廢話了&#xff0c;等會你們要打我了本…

python實現軟件的注冊功能(機器碼+注冊碼機制)

sklearn實戰-乳腺癌細胞數據挖掘 https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare 一、前言&#xff1a;目的&#xff1a;完成已有python圖像處理工具的注冊功能功能&am…

leetcode1306. 跳躍游戲 III(bfs)

這里有一個非負整數數組 arr&#xff0c;你最開始位于該數組的起始下標 start 處。當你位于下標 i 處時&#xff0c;你可以跳到 i arr[i] 或者 i - arr[i]。 請你判斷自己是否能夠跳到對應元素值為 0 的 任一 下標處。 注意&#xff0c;不管是什么情況下&#xff0c;你都無法…

Win10 UWP開發系列:使用VS2015 Update2+ionic開發第一個Cordova App

原文:Win10 UWP開發系列&#xff1a;使用VS2015 Update2ionic開發第一個Cordova App安裝VS2015 Update2的過程是非常曲折的。還好經過不懈的努力&#xff0c;終于折騰成功了。 如果開發Cordova項目的話&#xff0c;推薦大家用一下ionic這個框架&#xff0c;效果還不錯。對于Cor…

vavr_使用Vavr在Java 8流中更好的異常處理

vavrby Rajasekar Elango由Rajasekar Elango In this post, I will provide tips for better exception handling in Java 8 streams using the Functional Java library Vavr.在這篇文章中&#xff0c;我將提供使用Functional Java庫Vavr在Java 8流中更好地處理異常的技巧。 …

Python-strace命令追蹤ssh操作

Python-strace命令追蹤ssh操作 通過strace 命令追蹤ssh的進程ID&#xff0c;記錄操作的命令[實際上是內核里面記錄的東西]&#xff0c;進行操作日志的Py解析達到效果 追蹤進程并寫入ssh操作到文件中 Ps: 此時機器A已經ssh登錄了機器B&#xff0c;取得它的ssh進程PID 機器A登錄后…

java h2 derby_嵌入式H2數據庫的Spring配置以進行測試

小編典典由于我不知道是否有任何工具可以檢查數據庫&#xff0c;我認為一個簡單的解決方案是使用支持HSQL&#xff0c;H2和Derby 的Spring嵌入式數據庫(3.1.x docs&#xff0c;current docs)。 。使用H2&#xff0c;你的xml配置如下所示&#xff1a;如果你更喜歡基于Java的配置…

基礎的python程序_Python程序入門

Python語法元素入門Python語法元素分析注釋注釋&#xff1a;程序員在代碼中加入的說明信息&#xff0c;不被計算機執行注釋的兩種方法&#xff1a;單行注釋以#開頭多行注釋以開頭和結尾# Here are the commentsThis is a multiline commerntused in Python縮進1個縮進 &#xf…

解決阿里云服務器磁盤報警

一般磁盤報警涉及到實際磁盤和inode文件索引節點 1.df -h檢查磁盤占用不高 2.df -i檢查inode文件索引節點有一個掛載目錄達到89%,里面有一個目錄產生大量的4k大的緩存文件,刪除該目錄下的文件解決: 刪除該目錄下小于4kb的文件 find /data/tmp -type f -size -4 -exec rm -rf {}…

leetcode310. 最小高度樹(bfs)

對于一個具有樹特征的無向圖&#xff0c;我們可選擇任何一個節點作為根。圖因此可以成為樹&#xff0c;在所有可能的樹中&#xff0c;具有最小高度的樹被稱為最小高度樹。給出這樣的一個圖&#xff0c;寫出一個函數找到所有的最小高度樹并返回他們的根節點。格式該圖包含 n 個節…

如何構建自己的免費無服務器評論框

by Shaun Persad通過Shaun Persad 如何構建自己的免費無服務器評論框 (How you can build your own free, serverless comment box) Contentful’s flexible content modeling goes far beyond blog posts. Here’s how you can leverage Contentful and Netlify to create a …

[Swift]LeetCode1035.不相交的線 | Uncrossed Lines

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★?微信公眾號&#xff1a;山青詠芝&#xff08;shanqingyongzhi&#xff09;?博客園地址&#xff1a;山青詠芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;?GitHub地址&a…