快速排序是一種最壞情況下時間複雜度為o(n^2)的排序演算法,雖然最壞情況下效能較差,但快速排序通常是實際排序應用中的最好的選擇,因為它的平均效能非常好,其期望時間複雜度為o(nlgn),且o(nlgn)中隱含的常數因子非常小,且能夠進行原址排序,在虛存環境中也能很好地工作,快速排序是一種不穩定的排序演算法。
快速排序採用的思想和合併排序是一樣的,即分治法。快速排序的分治思想表現為:
1、首先從待排序的數中選擇乙個作為基數,基數的選擇對於排序的效能有很大的影響,也是快排改進的關鍵所在。
2、分治,將比基數小的數放在左邊,比基數大的數放在右邊。
3、對分出來的兩個分割槽分別執行上一步,直到區間只有乙個數為止。
快速排序的**實現如下:
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
defpartition
(a,p,r)
: x = a[r]
# 基數
i = p -
1for j in
range
(p,r)
:if a[j]
<= x:
i +=
1 a[i]
,a[j]
= a[j]
,a[i]
a[i+1]
,a[r]
= a[r]
,a[i+1]
return i +
1def
quicksort
(a,p,r)
:if p < r:
#分治 q = partition(a,p,r)
quicksort(a,p,q-1)
quicksort(a,q+
1,r)
if __name__ ==
"__main__"
: a =[2
,8,7
,1,3
,5,6
,4] quicksort(a,0,
len(a)-1
)print
(a)
在分析快速排序的平均情況效能時,前提假設輸入資料的所有排列都是等概率的,但在實際工程中這個假設並不會總是成立,因此通過在演算法中引入隨機性,使得演算法對於所有的輸入都能獲得較好的期望效能。隨機化的快速排序採用一種稱為隨機抽樣的隨機化技術,即隨機選擇元素作為基數從而進行資料的劃分。
隨機快速排序**實現如下:
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import random
defpartition
(a,p,r)
: x = a[r]
# 基數
i = p -
1for j in
range
(p,r)
:if a[j]
<= x:
i +=
1 a[i]
,a[j]
= a[j]
,a[i]
a[i+1]
,a[r]
= a[r]
,a[i+1]
return i +
1def
random_partition
(a,p,r)
: i = random.randint(p,r)
#隨機的變化
a[i]
,a[r]
= a[r]
,a[i]
return partition(a,p,r)
defrandom_quicksort
(a,p,r)
:if p < r:
#分治 q = random_partition(a,p,r)
random_quicksort(a,p,q-1)
random_quicksort(a,q+
1,r)
if __name__ ==
"__main__"
: a =[2
,8,7
,1,3
,5,6
,4] random_quicksort(a,0,
len(a)-1
)print
(a)
學習《演算法導論》第七章 快速排序 總結
快速排序通常是用於排序的最佳選擇,這是因為它的平均效能非常好,期望的執行時間為o nlg n 且常數因子很小.另外,它還能夠進行就地排序.它的最壞執行時間為o n 2 快速排序和合併排序一樣,也採用了分治的思想.分治,之前學過,有三個步驟 分解,解決,合併.下面對a p.r 講述快速排序的思想 分解...
演算法導論 第七章《快速排序》
本章介紹了快速排序及其演算法分析,快速排序採用的是分治演算法思想,對包含n個數的輸入陣列,最壞情況下執行時間為 n 2 但是平均效能相當好,期望的執行時間為 nlgn 另外快速排序能夠就地排序 我理解是不需要引入額外的輔助空間,每次劃分能確定乙個元素的具體位置 在虛擬環境中能很好的工作。快速排序演算...
演算法導論 第七章 快速排序
快速排序通常是實際應用中最好的選擇,因為它的平均效能非常好,它的期望時間複雜度為o nlng 而且隱含的常數因子非常小。另外,它還是原址排序。quicksort a,p,r if p隨著程式的執行,陣列被劃分為4個 小於主元,大於主元,未劃分,主元,可能有空的 區域。對於partition中的第3 ...