快速排序(英語:quicksort),又稱劃分交換排序(partition-exchange sort),簡稱快排,一種排序演算法,最早由東尼·霍爾提出。在平均狀況下,排序 n個專案要 o(n\log n)(大o符號)次比較。在最壞狀況下則需要 o(n^)} )次比較,但這種狀況並不常見。事實上,快速排序 theta (n\log n)通常明顯比其他演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地達成。
快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)。
步驟為:
從數列中挑出乙個元素,稱為「基準」(pivot),
重新排序數列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準後面(相同的數可以到任何一邊)。在這個分割結束之後,該基準就處於數列的中間位置。這個稱為分割(partition)操作。
遞迴地(recursively)把小於基準值元素的子數列和大於基準值元素的子數列排序。
遞迴到最底部時,數列的大小是零或一,也就是已經排序好了。這個演算法一定會結束,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。
本例採用原地排序版本。
簡單版本的缺點是,它需要 omega (n)的額外儲存空間,也就跟歸併排序一樣不好。額外需要的儲存器空間配置,在實際上的實現,也會極度影響速度和快取的效能。有乙個比較複雜使用原地(in-place)分割演算法的版本,且在好的基準選擇上,平均可以達到 o(\log n)空間的使用複雜度。
#quick sort
class quicksort:
def main(self,c):
assert type(c) == list or type(c) == tuple
list1 = list(c)
n = len(list1)
self.sort(list1,0,n)
return type(c)(list1)
def sort(self,c,left,right):
# print("c:",c,"l:",left ,"r:",right)
n = len(c)
if n < 2:
return c
if right - left < 2:
return c
de = self.quicksort(c,left,right-1)
self.sort(c,left,de)
self.sort(c,de+1,right)
return c
def quicksort(self,c,s,p):
r = p - 1
l = s
pivot = c[p]
# print("pivot:",pivot)
for i in range(s,p):
if c[i] >= pivot:
l = i
for j in range(r, s-1,-1):
if l == j:
c[l],c[p] = c[p],c[l]
# print(c)
return l
if c[j] <= pivot:
r = j
c[l],c[r] = c[r],c[l]
# print(c)
break
for j in range(r, s-1,-1):
if c[j] <= pivot:
c[l],c[j] = c[j],c[l]
return j
return p
#test
a = (9, 8, 6, 7, 4, 5, 3, 2, 1)
p = quicksort()
print(p.main(a))
python實現快速排序
快速排序的思想是任意選取要排序的list中的乙個數pivot,每次遞迴時將list按照 小於pivot的,pivot,大於pivot的 排序,再對小於和大於pivot部分分別快速排序。function quicksort list select a pivot foreach x in list i...
Python實現快速排序
快速排序的思路 numlist 6,8,1,4,3,9,5,4,11,2,2,15,6 1 設 keys 又稱為監視哨 等於 numlist 0 i等於0 j等於len numlist 1,即如下 numlist 6,8,1,4,3,9,5,4,11,2,2,15,6 keys 6 i 0 j2 1...
python實現快速排序
coding utf 8 實現對列表中的數進行快速排序 importrandom 隨機生成乙個有1000整數的列表 number random.randint 1 1000 foriinrange 1000 列印原始列表 printnumber 單個列表快速排序函式 返回一次排序後的列表和所選取基數...