看完動畫你還敢說不會 快速排序

前言

由于LeetCode上的算法題很多涉及到一些基礎的數據結構,為了更好的理解后續更新的一些復雜題目的動畫,推出一個新系列 -----《圖解數據結構》,主要使用動畫來描述常見的數據結構和算法。本系列包括十大排序、堆、隊列、樹、并查集、圖等等大概幾十篇。

快速排序

快速排序是由東尼·霍爾所發展的一種排序算法。在平均狀況下,排序 n 個項目要 Ο(nlogn) 次比較。在最壞狀況下則需要 Ο(n2) 次比較,但這種狀況并不常見。事實上,快速排序通常明顯比其他 Ο(nlogn) 算法更快,因為它的內部循環(inner loop)可以在大部分的架構上很有效率地被實現出來。

快速排序使用分治法(Divide and conquer)策略來把一個串行(list)分為兩個子串行(sub-lists)。

快速排序又是一種分而治之思想在排序算法上的典型應用。本質上來看,快速排序應該算是在冒泡排序基礎上的遞歸分治法。

算法步驟

  1. 從數列中挑出一個元素,稱為 “基準”(pivot);

  2. 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的后面(相同的數可以到任一邊)。在這個分區退出之后,該基準就處于數列的中間位置。這個稱為分區(partition)操作;

  3. 遞歸地(recursive)把小于基準值元素的子數列和大于基準值元素的子數列排序;

遞歸的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞歸下去,但是這個算法總會退出,因為在每次的迭代(iteration)中,它至少會把一個元素擺到它最后的位置去。

來源:github.com/hustcc/JS-S…

算法演示

排序動畫過程解釋

  1. 首先,操作數列中的所有數字

  2. 在所有數字中選擇一個數字作為排序的基準(pivot), pivot 通常是隨機選擇的,在這里為了演示方便,我們選擇最右邊的數字作為 pivot

  3. 選取好 pivot 后,在操作數列中選擇最左邊的數字標記為 左標記 ,最右邊的數字標記為 右標記

  4. 將左邊的標記向右移動

  5. 當 左標記 達到超過 pivot 的數字時,停止移動

  6. 在這里,8 > 6 ,所以停止移動

  7. 然后將右邊的標記向左移動

  8. 當 右標記 達到小于 pivot 的數字時,停止移動

  9. 在這里,4 > 6 ,所以停止移動

  10. 當左右標記停止時,更改標記的數字

  11. 因此,左標記 的作用是找到一個大于 pivot 的數字,右標記 的作用是找到一個小于 pivot 的數字

  12. 通過交換數字,可以在數列的左邊收集小于 pivot 的數字集合,右邊收集大于 pivot 的數字集合

  13. 交換之后,繼續移動 左標記

  14. 在這里,9 > 6 ,所以停止移動

  15. 然后將右邊的標記向左移動

  16. 當 右標記 碰撞到 左標記 時也停止移動

  17. 如果左右側的標記停止時,并且都在同一個位置,將這個數字和 pivot 的數字交換

  18. 這就完成了第一次操作

  19. 小于 6 的都在 6 的左側,大于 6 的都在 6 的右側

  20. 然后遞歸對這分成的兩部分都執行同樣的操作

  21. 完成 快速排序

代碼實現

為了更好的讓讀者用自己熟悉的編程語言來理解動畫,筆者將貼出多種編程語言的參考代碼,代碼全部來源于網上。

C++代碼實現

Java代碼實現

Python代碼實現

JavaScript代碼實現

如果你是iOS開發者,可以在GitHub上 github.com/MisterBooo/… 獲取更直觀可調試運行的源碼。

歡迎關注:

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

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

相關文章

java多張圖片合成一張_1分鐘學會“全景照片”拍攝技巧,從單反拍攝到PS合成,收藏備用...

作為一名攝影愛好者,您知道如何才能快速拍出一張全景照片,同時保證高畫質和照片不畸變?比如下面的2張圖片:要想得到這樣的全景照片,千萬不要通過后期裁剪,否則清晰度肯定會大打折扣!其實&#x…

Chrome查看cookie

不同版本的Chrome查看cookie的入口位置不同,這里介紹個通用的方法。 1.進入設置頁 2.搜索cookie 3.進入“cookie....”,選擇“查看所有......”

console 速查手冊

// 用于輸出一個 js 對象列表* console.log(obj1 [, obj2, ..., objN); // // 一個 js 字符串,其中包含0或多個不同類型的替代字符串 // console.log(String: %s, Int: %d,Float: %f, Object: %o, str, ints, // floats, obj) // // 也支持模板字符串 // console.lo…

nginx 帶寬_Nginx的Gzip功能

程序員自由之路 | 作者urlify.cn/eyuUVr | 來源什么是HTTP壓縮有時候客戶端和服務器之間會傳輸比較大的報文數據,這時候就占用較大的網絡帶寬和時長。為了節省帶寬,加速報文的響應速速,可以將傳輸的報文數據先進行壓縮,然后再進行…

分享朋友圈QQ空間需要哪些參數

shareTitle(分享標題 , shareDes(分享描述 , shareImg(分享圖片地址, shareUrl(分享地址, shareType(分享類型,微信朋友:WEIXIN、微信朋友圈:WEIXIN_CIRCLE、QQ:QQ)

【今日頭條】【抖音火山】前端開發實習生

今日頭條成立于2012年,致力于成為最懂你的信息平臺,連接人與信息,促進內容的創作和交流。通過技術,來改變整個內容生產、消費領域。 5年的時間內,我們已經成為了一個估值過百億美元,用戶數億,DA…

程序員真的是吃青春飯的嗎?(獻給即將進入職場的程序員們)

又有學生問我:程序員真的是吃青春飯的嗎?我是不是做到三十歲就該考慮轉型了? 我告訴他們: 這是中國的記者們用統計數字造下的一個彌天大謊,當我們看到微軟集團內的許多白發程序員在兢兢業業地工作的時候,我…

這一年多來,阿里Blink測試體系如何從0走向成熟?

2019獨角獸企業重金招聘Python工程師標準>>> 摘要: 引言 Apache Flink是面向數據流處理和批處理的分布式開源計算框架,2016年阿里巴巴引入Flink框架,改造為Blink。2017年,阿里整合了所有流計算產品,決定以B…

numpy中一些常見計算

文章目錄 numpy中的一些常見計算代碼方差標準差參考文獻numpy中的一些常見計算 代碼 import numpy as np from scipy import stats# 示例數據 data = np.array([1, 2,

system函數_自學C++基礎教程【函數】

函數的概念一個函數由:函數的返回值類型、函數名、參數表、函數體 這4個部分組成。int Add( int _a , int _b ) {return _a _b; }該函數 Add 完成對兩個整型數據的求和功能。函數的調用方式: 函數名(參數表);…

寧波政務云資源的介紹與申請

介紹 如圖所示: 寧波政務云分公共服務區與資源共享區。 公共服務區 公共服務區,一般部署允許互聯網訪問的系統,數據不敏感,不重要的,可對外開發的系統。 該區允許互聯網訪問,不允許訪問資源共享區&…

redis查數據

1 連接服務 12345[rootredis1-20 ~]# telnet 127.0.0.1 6380Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is ^].#用telnet也能登錄,但是無法查看key的value12[rootredis1-20 src]# ./redis-cli -p 6380#redis可能有好幾個服務,要指定端…

python幫助文檔在哪_python文檔在哪里

對于Python中一些不清楚的模塊,可以通過文檔學習如何使用,但是python文檔在哪里呢?這個問題我們可以使用Python命令進行查看。方法一 在python命令行輸入以下內容help(time) # 很詳細的模塊文檔 help(time.localtime()) # 很詳細的函數文檔 h…

政務云公共服務區與資源共享區數據交換的方式

上文《寧波政務云資源的介紹與申請》介紹過,公共服務區與資源共享區是不能互訪的,只能是資源共享區單向訪問公共服務區。 我有一項目,要能互聯網訪問,又要訪問“寧波大數據共享平臺”的接口,“寧波大數據共享平臺”在…

Java程序員的IntelliJ IDEA使用教程

前言 博主是Java程序員,以前一直都用myeclipse來開發的,說實話感覺myeclipse毫無美感可言,后來經過同事介紹,認識了IDEA,一眼就相中了IDEA黑色的主題風格,自此就拋棄了舊愛myeclipse。當時還不懂IDEA功能上…

python中random函數用法_random函數的用法

展開全部 用法: 1、隨2113機生成(0,1)之間的浮點數 random.random() 2、隨機生成100-200的整數5261 random.randint(100,200) 3、隨機產生范圍為410210間隔為2的數 random.randrange(0,11,2) 注:這里輸出(0,2,4,6,8,10…

提防易怒的危機

我工作多年,多年來認識一些官場、商場的人。 我與他們相處時,深深體會到太忙、太累的主管,常呈現的狀態是“易怒”。 這些人精神繃得太緊,體力透支,睡眠不足,開會太久,長期都在趕進度。 易怒…

2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1)

2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) 思路: A Exam 思路:水題 代碼: #include<bits/stdc.h> using namespace std; int main(){int k;scanf("%d",&k);char s1[1010],s2[1010];scanf("%s%s",s1,s2);int same0;int ns…

python random()*10的值不可能是_Python

Python 生成隨機數、隨機字符串 #!/usr/bin/python # -*- coding: UTF-8 -*- import random import string # 隨機整數&#xff1a; print random.randint(1,50) # 隨機選取0到100間的偶數&#xff1a; print random.randrange(0, 101, 2) # 隨機浮點數&#xff1a; print rand…

Prince2與PMP的區別

p2有7個原則&#xff0c;7個主題&#xff0c;7個流程&#xff0c;即37二十一。 P2有26個管理產品模板。 2009版本是經典版本&#xff0c;2017版本與2009版本內容基本沒變&#xff0c;梳理了目錄&#xff0c;使內容更加有可讀性。 P2是非常好的項目管理方法論&#xff0c;任何…