排序算法之快速排序詳解

一、算法介紹

快速排序:快速排序的基本思想是通過一次排序將等待的記錄分成兩個獨立的部分,其中一部分記錄的關鍵字小于另一部分的關鍵字。C部分的快速排序一直持續到整個序列被排序。

任取一個元素 (如第一個) 為中心
提出所有小于它的元素,并將大于它的元素放回,形成左右兩個子表。
為每個子表重新選擇中心元素,并根據此規則進行調整,直到每個子表只剩下一個元素

①每次行程的子表是由兩端到中間的交替近似形成的。

②由于每個子表的操作在每次行程中都是相似的,所以可以使用遞歸算法。

二、基本步驟

設置兩個指針i,j,首先在序列中選擇一個.temp,并將數字J點與temp進行比較。如果它大于溫度,它將減少1。如果它小于TEMP,則應該取高于當前位置J的值。


三、算法分析

最好:劃分后,左側右側子序列的長度相同,

最壞:從小至大,遞歸樹變成一棵樹。每個分區只能得到一個對象的子序列小于前一個。它必須通過n-1次來定位所有對象,第二次需要通過n-i鍵代碼比較來找到第二個對象的位置。

?

如果所有可能的置換的概率相同,則優選最佳情況和最壞情況平均值。

時間效率:O(nlog2n) —每趟確定的元素呈指數增加
空間效率:O(log2n)—遞歸要用到棧空間
穩 定 性: 不穩定 —可選任一元素為支點

1.如何選樞紐

從上面的描述中可以看出,快速排序是通過樞軸點來回交換的,因此快速排序的分類次數與初始序列有關。
因此,選擇快速分選的關鍵點非常重要,因為它關系到分選的效率。

取前或后法:序列中的第一個或最后一個元素用作基準,如果輸入序列(上面的數組)是隨機的,則處理時間是可接受的。如果數組已經被排序,那么分區就是一個非常糟糕的分區。由于每個分區只能減少要排序的序列,所以這是最壞的情況,并且時間復雜度為_(n^2)。此外,輸入數據排序或部分排序是很常見的。因此,使用第一個元素作為中心元素是非常糟糕的。

隨機選取基準
這是一個相對安全的策略。因為樞軸的位置是隨機的,所以得到的分割不會總是產生不好的分割。當整個陣列相同時,仍然是最壞的情況,并且時間復雜度為O(n2)。因此,對于大多數輸入數據,隨機快速排序可以達到O(nlogn)的預期時間復雜度。

三數取中法:在快速排隊過程中,每次我們以一個元素作為支點值,用該數將序列分成兩部分。本文采用三位數法,即以左、中、右三位數作為關鍵值,然后進行排序。顯然,三位數的中值分割方法消除了預排序輸入的不良情況,并將快速隊列的比較次數減少了大約14%。

2.如何證明時間復雜度

1、最優情況

在最佳情況下,分區平均每次分區。如果對n個關鍵字進行排序,則遞歸樹的深度為[log2n]+1([x]表示不大于x的最大整數)。也就是說,只需要2次遞歸日志,所需的時間是t(n)。第一個分區應該掃描整個陣列一次。n次比較。然后,獲得的樞軸將陣列分成兩部分,因此每個部分需要T(n/2)時間(注意,最佳情況是,所以分成兩半)。結果,作為連續劃分的結果,作出了以下不等式推斷:
這表明,在最佳情況下,快速排序算法的時間復雜度為O(nLogn)。

2.最壞情況

然后看看快速調度的最壞情況,當要排序的序列是正序或反序時,并且每個分區只產生比前一個分區少一個記錄子序列,注意另一個是空的。如果繪制遞歸樹,則它是傾斜樹。此時需要執行n‐1次遞歸調用,且第i次劃分需要經過n‐i次關鍵字的比較才能找到第i個記錄,也就是樞軸的位置,因此比較次數為n(n-1)/2,最終其時間復雜度為O(n^2)。

3.平均時間復雜度

直接設對規模的數組排序需要的時間期望為, 期望其實就是平均復雜度換個說法.
空表的時候不用排, 所以初值條件就是 T(0) = 0 .所謂快排就是隨便取出一個數,一般是第一個數,然后小于等于他的放左邊, 大于他的的排右邊.比如左邊 k 個那接下來還要排: T(n - k) + T (k - 1) 的時間.然后 k 多少那是不確定的, 遍歷 1~ n , 出現概率都是相等的. 另外分割操作本身也要時間 P(n) , 操作花費是線性時間 P(n) = cn , 這也要加進去, 所以一共是:

四、完整代碼示例

 1 public class QuickSort {
 2 
 3     //任取一個元素 (如第一個) 為中心
 4     //所有比它小的元素一律前放,比它大的元素一律后放,形成左右兩個子表;
 5     //對各子表重新選擇中心元素并依此規則調整,直到每個子表的元素只剩一個
 6     //一趟排序過程后我們返回樞紐的位置
 7     int partition(int A[], int left, int right) {
 8         //選擇樞紐元素
 9         int p = A[left];
10         while (left < right) {
11             //如果尾指針位置的數比樞紐數要大,移動尾指針的位置,否則就把所指示的值給首指針的位置
12             while (left < right && A[right] >= p) {
13                 --right;
14             }
15             A[left] = A[right];
16             //如果首指針位置的數比樞紐數要小,移動首指針的位置,否則就把所指示的值給尾指針的位置
17             while (left < right && A[left] <= p) {
18                 ++left;
19             }
20             A[right] = A[left];
21         }
22         //此時的首尾指針已經相等,把樞紐的值賦給首尾指針相等的位置即可
23         A[left] = p;
24         return left;
25     }
26 
27     //快速排序的遞歸
28     void Quick(int A[], int left, int right) {
29         //定義一個樞紐的位置
30         int pnode;
31         if (left < right) {
32             pnode = partition(A, left, right);
33             Quick(A, left, pnode - 1);
34             Quick(A, pnode + 1, right);
35         }
36     }
37 
38     public static void main(String[] args) {
39 
40     }

?

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

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

相關文章

openstack 中國聯盟公開課參會總結

主流趨勢 1. openstack defcore 互操作性認證。打通不同的openstack 廠商之間的連接2. 首批OpenStack管理員認證(COA)將于2016年進行3. 混合云應用廣泛 Cloud Broker,cascading openstack 云連接器4. DevOps5. 虛擬桌面6. Storage 方面&#xff0c;Ceph和Glusterfs 7. Network…

bzoj1088[SCOI2005]掃雷Mine

1088: [SCOI2005]掃雷Mine Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4284 Solved: 2552[Submit][Status][Discuss]Description 相信大家都玩過掃雷的游戲。那是在一個n*m的矩陣里面有一些雷&#xff0c;要你根據一些信息找出雷來。萬圣節到了&#xff0c;“余”人國流…

Re:從零開始的Vue項目搭建

Re&#xff1a;從零開始的Vue項目搭建初始的終結與結束的開始Nodejs項目的簡單測試從零開始webpack開發模式webpack編譯打包后記初始的終結與結束的開始 最開始接觸vue項目搭建是從vue-cli開始&#xff0c;模板式操作&#xff0c;一鍵搞定&#xff0c;幾乎可以無縫進入代碼開發…

在數據庫插入帶小數點數據的問題

想在mysql插入以下數據設計表的時候沒有注意,之前都用的int,這次換成了double,但是插入第一條3.50的時候數據庫顯示為:查了之后知道是設計表的時候沒有注意小數點的設置轉載于:https://juejin.im/post/5c0f61bb6fb9a049ea38cbe9

oracle 11g 創建 job 20

15-10-19 23:48:04分類&#xff1a; Oracle--創建一次執行的匿名塊任務&#xff0c;成功調用一次后job消失BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name > my_new_job2, job_type > PLSQL_BLOCK, job_action &g…

Jzoj5317 Func

f(1)1 f(2x)f(x) f(2x1)f(x)f(x1) 給出n<10^6&#xff0c;求:所有的i滿足f(i)n 第一道類歐算法 我們考慮一個性質 f(2x1)f(x)f(x1)f(2x)f(2x2) 所以&#xff0c;顯然有f(2x1)>f(2x) f(2x1)>f(2x2) 那么現在我們知道了f(2x1),自然考慮枚舉一個f(2x) 可以按照以下形式…

C# WPF 用代碼畫一幅圖(*精品*)

概述有時候我們的程序界面中需要顯示一些簡單的示意圖&#xff0c;一般我們有原圖的話直接嵌入我們程序就可以&#xff0c;但有時候我們沒有原圖&#xff0c;這時候我們不妨用代碼自己畫出來.今天小編要給大家展示的是這樣一副圖片&#xff1a;接下來&#xff0c;我就用代碼純手…

礦難讓顯卡壓了那么多貨咋辦?NV如是說

2019獨角獸企業重金招聘Python工程師標準>>> 在蘇州 GTC 開幕的幾天前&#xff0c;英偉達剛剛遭遇了一次股價的腰斬。 近來加密貨幣的熱度漸低&#xff0c;受到挖礦熱潮照顧許多的英偉達「礦機」銷量受到打擊&#xff0c;甚至出現了嚴重的庫存危機&#xff0c;加上近…

花式看超級碗 人工智能、大數據在碗里

“超級碗”可不是一個大碗!!!超級碗(Super Bowl)是美國國家美式足球聯盟(也稱為國家橄欖球聯盟)的年度冠軍賽&#xff0c;勝者被稱為“世界冠軍”。超級碗一般在每年1月最后一個或2月第一個星期天舉行&#xff0c;那一天稱為超級碗星期天(Super Bowl Sunday)。超級碗是比賽的名…

Git分支操作與遠程倉庫的使用

Git分支操作本地倉庫創建分支合并分支刪除分支遠程倉庫push 推送遠程分支pull 拉取遠程分支fetch 更新遠程分支本地分支與遠程分支的跟蹤關系本地倉庫 由于Git的分布式特性&#xff0c;所以沒有絕對的本地和遠程概念&#xff0c;一切都是相對的。對于分支的操作&#xff0c;個…

SimMechanics/Second Generation倒立擺模型建立及初步仿真學習

筆者最近搗鼓Simulink&#xff0c;發現MATLAB的仿真模塊真的十分強大&#xff0c;以前只是在命令窗口敲點代碼&#xff0c;直到不小心敲入simulink&#xff0c;就一發不可收拾。話說simulink的模塊化建模確實方便&#xff0c;只要拖拽框框然后雙擊設置屬性就可以慢慢堆建自己的…

10 行代碼提取復雜 Excel 數據

把 Excel 文件導入關系數據庫是數據分析業務中經常要做的事情&#xff0c;但許多 Excel 文件的格式并不規整&#xff0c;需要事先將其中的數據結構化后再用 SQL 語句寫入數據庫。而一般情況下&#xff0c;結構化的工作量會比較大&#xff0c;而且很難通用&#xff0c;每次都要針…

將一個數組拆分為若干個相等數組

var a [法國,澳大利亞,智利,新西蘭,西班牙,加拿大,阿根廷,美國,0,國產,波多黎各,英國,比利時,德國,意大利,意大利]; var b []; var result []; var k 0; for(var i 0; i<a.length; i){ if(i%3 0){ b []; for(var j 0; j<3; j){ if(a[ij] undefined){ continue; …

人工智能模型的網絡結構可視化

本文主要介紹人工智能模型的網絡結構可視化的常見方法。對于使用神經網絡模型來說&#xff0c;我們主要關注的是模型的輸入和輸出。在 ML.NET 中使用 ONNX 模型時&#xff0c;我們就需要了解這些信息&#xff0c;以便在構成神經網絡的所有層之間生成連接映射。下圖就是昨天 《Y…

Git 撤銷操作 / 回滾歷史

撤銷操作 git checkout -- <filename>&#xff0c;放棄文件的當前更改&#xff0c;回到最近一次的提交狀態git reset HEAD <filename>&#xff0c;取消暫存文件git commit --amend&#xff0c;覆蓋上一次的提交&#xff0c;雖然不是撤銷操作&#xff0c;但有類似的…

整理ASP.NET MVC 5各種錯誤請求[401,403,404,500]的攔截及自定義頁面處理實例

http://2sharings.com/2015/asp-net-mvc-5-custom-404-500-error-hanlde https://blog.csdn.net/yhyhyhy/article/details/51003683 ASP.NET MVC 5的開發中&#xff0c;服務器的各種錯誤[如&#xff1a;401&#xff08;登錄授權驗證&#xff09;&#xff0c;403&#xff08;禁止…

url字符轉義

作者在做短鏈接功能時&#xff0c;url參數里帶了&字符&#xff0c;結果無法轉換。后來查了一下&#xff0c;發現可以用其它符號代替。下面是對應表 URL 中號表示空格 %2B 空格 URL中的空格可以用號或者編碼 %20 / 分隔目…

編輯器領域正發生變革?從面試看 Visual Studio Code 的崛起

Visual Studio Code&#xff08;VS Code&#xff09;的使用率在迅速上升&#xff0c;現在已經成為大多數工程師的首選編輯器&#xff0c;并似乎正迅速搶占其他頂級編輯的市場份額。Triplebyte 每周都會面試數百名工程師。在每次面試中&#xff0c;我們都會記錄面試者使用的編輯…

C#7.0 ref引用傳遞

1.概要在工作中大家用到引用類型是非常多的&#xff0c;大家都知道引用類型在使用過程中傳遞的是對象引用并不會發生整個對象復制。而值類型在傳遞的過程中就不一樣了&#xff0c;我曾經在編寫代碼時希望通過值類型來壓低應用程序的內存占用&#xff0c;在高并發的情況大量的對…

Vue+Axios同步請求

axios本身是沒有同步請求的&#xff0c;要實現同步請求&#xff0c;用到的是ES7的async和await ES7的異步特性async / await async用于聲明一個函數是異步的&#xff0c;await用于聲明在一個異步函數中等待語句執行完畢。也就是說await只能在async函數中使用。簡單示例如下&a…