1. 快速排序演算法在平均情況下的時間復雜度為 求詳解
時間復雜度為O(nlogn) n為元素個數
1. 快速排序的三個步驟:
1.1. 找到序列中用於劃分序列的元素
1.2. 用元素劃分序列
1.3. 對劃分後的兩個序列重復1,2兩個步驟指導序列無法再劃分
所以對於n個元素其排序時間為
T(n) = 2*T(n/2) + n (表示將長度為n的序列劃分為兩個子序列,每個子序列需要T(n/2)
的時間,而劃分序列需要n的時間)
而 T(1) = 1 (表示長度為1的序列無法劃分子序列,只需要1的時間即可)
T(n) = 2^logn + logn * n (n被不斷二分最終只能二分logn次(最優的情況,每次選取
的元素都均分序列))
= n + nlogn
因此T(n) = O(nlogn)
以上是最優情況的推導,因此快速排序在最優情況下其排序時間為O(nlogn),通常平均情況
我們也認為是此值。
在最壞情況下其會退化為冒泡排序,T(n) = T(n - 1) + n (每次選取的元素只能將序列劃分為
一段,即自身是 最小元素或最大元素)
因此T(n) = n * (n-1) / 2 相當於O(n^2)
2. 快速排序演算法復雜度
快速排序演算法的平均時間復雜度為O(nlogn)
3. 快速排序復雜度
快速排序的時間性能取決於快速排序遞歸的深度,可以用遞歸樹來描述遞歸演算法的執行情況。
最好情況
如圖9‐9‐7所示,它是{50,10,90,30, 70,40,80,60,20}在快速排序過程中的遞歸過程。由於我們的第一個關鍵字是50,正好是待排序的序列的中間值,因此遞歸樹是平衡的,此時性能也比較好。
由數學歸納法可證明,其數量級為O(nlogn)。
4. 快速排序方法的時間復雜度為O(n^2)=n(n-1)/2中O()是什麼意思
O(1): 表示演算法的運行時間為常量
O(n): 表示該演算法是線性演算法
O(㏒2n): 二分查找演算法
O(n2): 對數組進行排序的各種簡單演算法,例如直接插入排序的演算法。
O(n3): 做兩個n階矩陣的乘法運算
O(2n): 求具有n個元素集合的所有子集的演算法
O(n!): 求具有N個元素的全排列的演算法
O(n²)表示當n很大的時候,復雜度約等於Cn²,C是某個常數,簡單說就是當n足夠大的時候,n的線性增長,復雜度將沿平方增長。
一個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機運行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且一個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。一個演算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。
一般情況下,演算法中基本操作重復執行的次數是問題規模n的某個函數,用T(n)表示,若有某個輔助函數f(n),使得當n趨近於無窮大時,T(n)/f(n)的極限值為不等於零的常數,則稱f(n)是T(n)的同數量級函數。記作T(n)=O(f(n)),稱O(f(n))
為演算法的漸進時間復雜度,簡稱時間復雜度。
5. 快速排序法的平均時間復雜度是多少
快速排序法的時間復雜度是nlogn(n×log以2為底n的對數)
拓展:
快速排序(Quicksort)是對冒泡排序的一種改進。
快速排序由C. A. R.
Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
附各種排序法的時間復雜度如下:
6. 快速排序等時間復雜度問題
時間復雜度實際上就是程序的關鍵語句運行的次數。演算法復雜度的評價一般是演算法對於一個大小固定的樣本的執行時間,一般這個時間可以通過一個根據演算法評估出來的多項式來表達的。例如,選擇排序的復雜度就是O(n^2)[註:選擇排序對於長度為n的序列每選出第k個數都要和後面k+1~n數進行比較,所以實際的復雜程度應該是n+n-1+n-2+...+2+1=(n^2+n)/2而在復雜度表示時,n被看作極大的值,所以忽略他的系數和後面的低次項,所以表示成o(n^2)] 對於快速排序,同樣可以求出它的平均復雜度是O(NlogN)具體的計算方法可以自己嘗試(提示,劃分次數是log N 比較次數是N)最壞情況是O(n^2)
7. 快速排序的時間復雜度
快排的平均時間為:T(n) = k*n*lnn
時間復雜度為:O(n*logn)
8. 快速排序的時間復雜度是多少
快速排序的平均時間復雜度是O(nlogn),在最壞情況下的時間復雜度退化為O(n2)
9. 排序演算法的時間復雜度
所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。排序演算法,就是如何使得記錄按照要求排列的方法。排序演算法在很多領域得到相當地重視,尤其是在大量數據的處理方面。
一個優秀的演算法可以節省大量的資源。在各個領域中考慮到數據的各種限制和規范,要得到一個符合實際的優秀演算法,得經過大量的推理和分析。
空間復雜度(Space Complexity)是對一個演算法在運行過程中臨時佔用存儲空間大小的量度,記做S(n)=O(f(n))。比如直接插入排序的時間復雜度是O(n^2),空間復雜度是O(1) 。
而一般的遞歸演算法就要有O(n)的空間復雜度了,因為每次遞歸都要存儲返回信息。一個演算法的優劣主要從演算法的執行時間和所需要佔用的存儲空間兩個方面衡量。
(9)快速排序演算法時間復雜度擴展閱讀:
排序演算法經過了很長時間的演變,產生了很多種不同的方法。對於初學者來說,對它們進行整理便於理解記憶顯得很重要。每種演算法都有它特定的使用場合,很難通用。因此,我們很有必要對所有常見的排序演算法進行歸納。
排序大的分類可以分為兩種:內排序和外排序。在排序過程中,全部記錄存放在內存,則稱為內排序,如果排序過程中需要使用外存,則稱為外排序。下面講的排序都是屬於內排序。
內排序有可以分為以下幾類:
(1)、插入排序:直接插入排序、二分法插入排序、希爾排序。
(2)、選擇排序:直接選擇排序、堆排序。
(3)、交換排序:冒泡排序、快速排序。
(4)、歸並排序
(5)、基數排序
10. 快速排序的復雜度怎麼算,是多少
這個,我確實一點也不懂,幫你搜索。
1.
快速排序-時空復雜度:
快速排序每次將待排序數組分為兩個部分,在理想狀況下,每一次都將待排序數組劃分成等長兩個部分,則需要logn次劃分。
而在最壞情況下,即數組已經有序或大致有序的情況下,每次劃分只能減少一個元素,快速排序將不幸退化為冒泡排序,所以快速排序時間復雜度下界為O(nlogn),最壞情況為O(n^2)。在實際應用中,快速排序的平均時間復雜度為O(nlogn)。
快速排序在對序列的操作過程中只需花費常數級的空間。空間復雜度S(1)。
但需要注意遞歸棧上需要花費最少logn最多n的空間。
2.快速排序-隨機化演算法:
快速排序的實現需要消耗遞歸棧的空間,而大多數情況下都會通過使用系統遞歸棧來完成遞歸求解。在元素數量較大時,對系統棧的頻繁存取會影響到排序的效率。
一種常見的辦法是設置一個閾值,在每次遞歸求解中,如果元素總數不足這個閾值,則放棄快速排序,調用一個簡單的排序過程完成該子序列的排序。這樣的方法減少了對系統遞歸棧的頻繁存取,節省了時間的消費。
一般的經驗表明,閾值取一個較小的值,排序演算法採用選擇、插入等緊湊、簡潔的排序。一個可以參考的具體方案:閾值T=10,排序演算法用選擇排序。
閾值不要太大,否則省下的存取系統棧的時間,將會被簡單排序演算法較多的時間花費所抵消。
另一個可以參考的方法,是自行建棧模擬遞歸過程。但實際經驗表明,收效明顯不如設置閾值。
3.快速排序的最壞情況基於每次劃分對主元的選擇。基本的快速排序選取第一個元素作為主元。這樣在數組已經有序的情況下,每次劃分將得到最壞的結果。一種比較常見的優化方法是隨機化演算法,即隨機選取一個元素作為主元。這種情況下雖然最壞情況仍然是O(n^2),但最壞情況不再依賴於輸入數據,而是由於隨機函數取值不佳。實際上,隨機化快速排序得到理論最壞情況的可能性僅為1/(2^n)。所以隨機化快速排序可以對於絕大多數輸入數據達到O(nlogn)的期望時間復雜度。一位前輩做出了一個精闢的總結:「隨機化快速排序可以滿足一個人一輩子的人品需求。」
隨機化快速排序的唯一缺點在於,一旦輸入數據中有很多的相同數據,隨機化的效果將直接減弱。對於極限情況,即對於n個相同的數排序,隨機化快速排序的時間復雜度將毫無疑問的降低到O(n^2)。解決方法是用一種方法進行掃描,使沒有交換的情況下主元保留在原位置。
4.設要排序的數組是A[0]……A[N-1],首先任意選取一個數據(通常選用第一個數據)作為關鍵數據,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。一趟快速排序的演算法是:
1)設置兩個變數I、J,排序開始的時候:I=0,J=N-1;
2)以第一個數組元素作為關鍵數據,賦值給key,即 key=A[0];
3)從J開始向前搜索,即由後開始向前搜索(J=J-1),找到第一個小於key的值A[J],並與A[I]交換;
4)從I開始向後搜索,即由前開始向後搜索(I=I+1),找到第一個大於key的A[I],與A[J]交換;
5)重復第3、4、5步,直到 I=J; (3,4步是在程序中沒找到時候j=j-1,i=i+1。找到並交換的時候i, j指針位置不變。另外當i=j這過程一定正好是i+或j+完成的最後另循環結束)
例如:待排序的數組A的值分別是:(初始關鍵數據:X=49) 注意關鍵X永遠不變,永遠是和X進行比較,無論在什麼位子,最後的目的就是把X放在中間,小的放前面大的放後面。
A[0] 、 A[1]、 A[2]、 A[3]、 A[4]、 A[5]、 A[6]:
49 38 65 97 76 13 27
進行第一次交換後: 27 38 65 97 76 13 49
( 按照演算法的第三步從後面開始找)
進行第二次交換後: 27 38 49 97 76 13 65
( 按照演算法的第四步從前面開始找>X的值,65>49,兩者交換,此時:I=3 )
進行第三次交換後: 27 38 13 97 76 49 65
( 按照演算法的第五步將又一次執行演算法的第三步從後開始找
進行第四次交換後: 27 38 13 49 76 97 65
( 按照演算法的第四步從前面開始找大於X的值,97>49,兩者交換,此時:I=4,J=6 )
此時再執行第三步的時候就發現I=J,從而結束一趟快速排序,那麼經過一趟快速排序之後的結果是:27 38 13 49 76 97 65,即所以大於49的數全部在49的後面,所以小於49的數全部在49的前面。
快速排序就是遞歸調用此過程——在以49為中點分割這個數據序列,分別對前面一部分和後面一部分進行類似的快速排序,從而完成全部數據序列的快速排序,最