幾種快速排序的耗時比較
陣列長度=10^4
固定pivot(首)
隨機pivot
三數取中
三數取中+插排
五數取中
隨機數組
0.03429 s
0.04581 s
0.0415 s
公升序陣列
4.98177 s
0.03306 s
0.03784 s
降序陣列
4.96196 s
0.03328 s
0.0342 s
重複陣列
4.29686 s
4.69243 s
4.53609 s
本質:分治思想
特點:每經過一次快排,軸點(pivot)元素必然就位!
過程:每經過一次快排,樞軸元素將所處理區域劃分為「小元素」和「大元素」兩段,並通過遞迴不斷劃分,最終得到乙個排序的序列。
核心技巧:每一次的partition都比較平均。
1.如果每次劃分都將所處理的區域劃分為長度基本相等的兩段
$$\frac=1\rightarrow k=log_n$$
很顯然只需大約log n層劃分,就能使最底層的每個分段長度不超過1。而每一趟劃分的過程中,關鍵碼比較次數不超過物件長度。所以當前情況下,元素比較次數不超過:
$$o(nlogn)$$
2.最壞情況:每次劃分得到的兩段總有一段為空,總的比較次數是
$$o(n^2)$$
方法1. 固定樞軸:
created on sun apr 8 10:35:06 2018
@author: yzdeng
"""import numpy as np
import timeit
import sys
sys.setrecursionlimit(1000000)
#固定pivot(陣列首元素做pivot)
def quick_sort1(lst,l,r):
if l>=r:
return
i=lj=r
pivot=lst[i]
while i=pivot:
j-=1
if i
方法2. 隨機樞軸:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
created on sun apr 8 17:20:36 2018
@author: dengyuzhao
"""
from random import choice
import numpy as np
import timeit
import sys
sys.setrecursionlimit(1000000)
def quick_sort1(lst,l,r):
if l>=r:
return
a=np.arange(l,r+1)
p=choice(a)
i=l
j=r
pivot=lst[p]
lst[p]=lst[i]
while i=pivot:
j-=1
if ilst[i]=lst[j]
i+=1
while ii+=1
if ilst[j]=lst[i]
j-=1
lst[i]=pivot
quick_sort1(lst,l,i-1)
quick_sort1(lst,i+1,r)
return lst
#test:
a1=np.random.normal(100,100,(10000,))
b1=list(a1)
print(timeit.timer(lambda:quick_sort1(b1,0,9999)).timeit(1))
a2=np.arange(10000)
b2=list(a2)
print(timeit.timer(lambda:quick_sort1(b2,0,9999)).timeit(1))
a3=np.arange(10000,0,-1)
b3=list(a3)
print(timeit.timer(lambda:quick_sort1(b3,0,9999)).timeit(1))
a4=[2]*10000
print(timeit.timer(lambda:quick_sort1(a4,0,9999)).timeit(1))
幾種排序演算法的比較
1.分類 非線性時間比較類排序 通過比較來決定元素間的相對位置關係,由於其時間複雜度不能突破o nlogn 因此稱為非線性時間比較類排序。線性時間比較類排序 不通過比較來決定元素間的相對位置關係,它可以突破基於比較排序的時間下界,以線性時間執行,因此稱為線性時間比較類排序。2.複雜度 3.演算法相關...
幾種排序演算法比較
資料結構 10 排序十 四 排序 sort thinking in algorithm 12.詳解十一種排序演算法 排序法平均時間 最差情形 穩定度額外空間 備註冒泡 o n2 o n2 穩定o 1 n小時較好 交換o n2 o n2 不穩定o 1 n小時較好 選擇o n2 o n2 不穩定o 1 ...
幾種快速的排序演算法
鴿巢排序,排序位元組串 寬位元組串最快的排序演算法,計數排序的變種 將計數緩衝區大小固定,少一次遍歷開銷 速度是stl中std sort的20多倍 更重要的是實現極其簡單!缺點是需要乙個size至少等於待排序陣列取值範圍的緩衝區,不適合int等大範圍資料。多一次遍歷的計數排序,排序位元組串的話速度約...