Python 快速排序

2021-07-02 11:35:12 字數 2878 閱讀 5983

最近摸了下pyhton,發現真心好用。寫下快排來練手。

import random

def partition(a,lo,hi):

i = lo

j = hi+1

v = a[lo]

while true:

while a[i]<=v:

i = i+1

if i == hi:

break

j = j-1

while a[j]>v:

j = j-1

if j == lo:

break

if i>=j:

break

a[i],a[j]=a[j],a[i]

a[lo],a[j] = a[j],a[lo]

return j

def quicksort(a,lo,hi):

if hi<=lo:

return

j = partition(a,lo,hi)

quicksort(a,lo,j-1)

quicksort(a,j+1,hi)

a =

for i in range(1000000):

quicksort(a,0,len(a)-1)

寫的時候很多小細節要注意,比如要注意切分中j的移動,任何一點對i和j不合適的改動都會導致錯誤。

100萬的資料時間是3.44223299616秒排序完成。

對比下選擇排序:1萬的資料在6.5秒內排序完成。100萬資料時間太長。

def selectionsort(a):

for i in range(len(a)):

for j in range(i,len(a)):

if a[i]>a[j]:

a[i],a[j]=a[j],a[i]

即使是簡單的快速排序也有多種改進方法:

1)存在很多重複元素的時候可以採用3路排序的方法,提高速度;

2)對小陣列排序,插入排序比快速排序更快,因為快速排序是遞迴的。

下面繼續修改**(加入小陣列用插入排序):

import random

import time   

def partition(a,lo,hi):

i = lo

j = hi+1

v = a[lo]

while true:

while a[i]<=v:

i = i+1

if i == hi:

break

j = j-1

while a[j]>v:

j = j-1

if i>=j:

break

a[i],a[j]=a[j],a[i]

a[lo],a[j] = a[j],a[lo]

return j

def quicksort(a,lo,hi):

f hi>=lo+15:

j = partition(a,lo,hi)

quicksort(a,lo,j-1)

quicksort(a,j+1,hi)

else:

selectionsort(a,lo,hi)

def selectionsort(a,lo,hi):

for i in range(lo,hi+1):

for j in range(i,hi+1):

if a[i]>a[j]:

a[i],a[j]=a[j],a[i]

a =

for i in range(1000000):

start = time.clock()  

quicksort(a,0,len(a)-1)

end = time.clock()  

print end-start 

print a[0:10]

100萬資料3.56445105976s完成,並沒有體現特別大的優勢,演算法書上說省15%左右的時間,還要仔細再研究下。

對多個重複的元素進行排序:

三相切分

import random

import time

def quick3sort(a,lo,hi):

if hi<=lo:

return

lt = lo

i = lo+1

gt = hi

v = a[lo]

while i<=gt:

if a[i]v:

a[i],a[gt] = a[gt],a[i]

gt =gt-1

else:

i = i+1

quick3sort(a,lo,lt-1)

quick3sort(a,gt+1,hi)

a =for i in range(1000000):

start = time.clock()

quick3sort(a,0,len(a)-1)

end = time.clock()

print end-start

print a[0:10]

100萬資料,範圍(1,100000000)。6.12628795802s完成。

三相切分基本思路是把資料分成小於v,等於v,大於v的三段。然後再對小於v和大於v的進行快速排序。

如果對相同元素多的資料比如(1:100)100萬組資料只在1.45126854664內完成。

(1:10)的資料只在0.754866314071內完成。

而對原始的quicksort要用3.83970068155,和範圍大的時間一樣。

實際上如果已知到鍵的種類,桶排序是最快的,它只需要o(n)的演算法複雜度。

python快速排序排序 python快速排序

import random def rand n for i in range n yield random.randint 0,1000 建立乙個隨機數列表 def createlist n lists for i in rand n return lists 挖坑法快速排序 def quick ...

排序 快速排序 Python

快速排序 快排 是非常常用的排序方法,在技術面試中出現頻率也特別高。它主要採用交換和分治的策略進行排序。是不穩定排序。步驟 1 在序列中選乙個元素作為劃分的基準元素 pivot 2 將所有不大於pivot的數字放在pivot的前面,大於pivot的數字放在pivot的後面 3 以pivot為界,對前...

python快速排序

coding utf 8 class quicksort def sort self,list,left,right 開始位置小於 位置 if left 取到中間的乙個下標值 s list left right 2 i 0 i left j 下標結束 j right while true 從開始位置...