5分鐘回憶快速排序

2021-10-23 03:24:53 字數 1621 閱讀 3776

複雜度分析

給我從小到大排序!!!

首先「瞎選」乙個值,找到其最終位置,即排好序後它在哪,並把小於它的丟左邊,大於的丟右邊。對左右子部分重複操作,直至子部分都只剩乙個元素,則所有元素都找到了其該在的位置。

第乙個?

如果陣列正好是從大到小的,那我每一輪都要擼(比較)n

nn個數才能找到選的數應該在哪,擼n

nn輪,實現過程相當與變成了選擇排序(先把乙個數丟最後面,再第二個…),複雜度o(n

2)o(n^2)

o(n2

)生成隨機數?

有意思嘛,本來就要減少執行時間,還要用**去生成隨機數,浪費時間。

簡單做法

取中間的數,無所謂了,反正要隨機,去算一組數的中值更麻煩。

過程中得把小的丟左邊,大的丟右邊,怎麼實現呢,難道另申請乙個陣列小的從前往後存,大的從後往前存?浪費空間!肯定動的是原陣列,以下通過選6作為第一輪基準值來說明

既然要對原陣列變動,則需要留乙個坑位來避免資料丟失,不然變動了值後面要用怎麼辦,誰做第乙個坑呢,當然是基準值的位置!先備份6,然後從頭開始遍歷陣列,一旦發現有比選中數6大的,比如第3個數7,把它丟到6的位置,這時候第3個數7已經沒用了,不怕被覆蓋,成為了新的坑位;然後從尾開始遍歷陣列,一旦發現有比選中數7小的,比如3,把3丟到新的坑位即將第三個數複製為3;然後從4四個數開始往後遍歷…直到遍歷完整個陣列,完成第一輪!下圖紅色圈代表坑位

一樣的思路,從頭開始遍歷,一旦發現有大的數停一下,然後從後遍歷,一旦發現有小的數,立刻交換這兩個數,免去了坑位…

ps:得注意角標問題,可以各後退一步

每次找的正好是中值,則除了加上這次耗費n次比較才找到自己的位置,還加上子部分的複雜度。最後結果為o(n

logn

)o(nlogn)

o(nlog

n)t (n

)=1, & \text \\ 2t(\frac)+n, & \text \end

t(n)

= t(n) &=2(2t(\frac)+\frac)+n\\&=2^2t(\frac)+2n\\&=3^3t(\frac)+3n\\&=2^+n\log_2 n\\&=nlog(n) \end

t(n)​=

2(2t

(22n

​)+2

n​)+

n=22

t(22

n​)+

2n=3

3t(2

3n​)

+3n=

2log2​

n+nlog2​

n=nl

og(n

)​即瞎選第乙個,且陣列倒敘的情況,複雜度o(n

2)o(n^2)

o(n2

)

5分鐘搞定快速排序

直接切入主題,快速排序分為兩過程 挖抗填數 分治法 先說下分治法,顧名思義就是 分而治之 的核心思想。簡單舉個例子體會一下 現在有100個人需要按照身高排成一列。首先,定個身高基準1.7m 定得太高和太低都會打破平衡 高與1.7m的都站在一列的右端,低於1.7m的都站在一列的左端。1.7m即為左右端...

5分鐘搞定快速排序

首先找到陣列中的乙個基準值 通常是中間值 遍歷陣列,如果比基準值小就放到左邊,比基準值大放到右邊 以基準值左右兩邊的子列作為新數列,不斷重複第一步和第二步 迭代法 def quick sort arr if len arr 2 return arr mid arr len arr 2 基準值 lef...

5分鐘快速部署Docker實戰

1.安裝docker.2.安裝tomcat.3.安裝nginx.名詞解釋 掛載 相當於本地的目錄做個快捷方式到虛擬機器的目錄裡 文章結尾提供以下內容的模板文件.一 安裝docker 1.按提示安裝,下一步下一步.輸入 docker run hello world 有訊息表示安裝成功.1.docker...