複雜度分析
給我從小到大排序!!!
首先「瞎選」乙個值,找到其最終位置,即排好序後它在哪,並把小於它的丟左邊,大於的丟右邊。對左右子部分重複操作,直至子部分都只剩乙個元素,則所有元素都找到了其該在的位置。
第乙個?
如果陣列正好是從大到小的,那我每一輪都要擼(比較)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...