Python—当中间元素是轴心时,如何实现快速排序?
有许多不同版本的快速排序以不同的方式拾取轴Python—当中间元素是轴心时,如何实现快速排序?,python,algorithm,sorting,quicksort,Python,Algorithm,Sorting,Quicksort,有许多不同版本的快速排序以不同的方式拾取轴 始终选择第一个图元或最后一个图元作为轴 选择一个随机元素作为轴 选择中间带作为轴心。 我使用最后一个元素作为轴心来实现一切都很好,但是当我尝试将相同的逻辑实现到中间元素时,它就不好用了 以下是我的python代码: import random import time start = time.time() def quickSort(a,l,r): if(l<r): p = partition(a,l,r)
- 始终选择第一个图元或最后一个图元作为轴
- 选择一个随机元素作为轴
- 选择中间带作为轴心。
最后一个元素作为轴心来实现
一切都很好,但是当我尝试将相同的逻辑实现到中间元素时,它就不好用了
以下是我的python代码:
import random
import time
start = time.time()
def quickSort(a,l,r):
if(l<r):
p = partition(a,l,r)
quickSort(a,l,p-1)
quickSort(a,p+1,r)
def partition(a,l,r):
i = l-1
p = a[(l+(r-l))//2]
for j in range(l,r):
if a[j] <= p:
i += 1
a[i],a[j] = a[j],a[i]
a[i+1],a[r] = a[r],a[i+1]
return (i+1)
N = 10
a = [random.randint(1,100) for i in range(N)]
print(a)
quickSort(a,0,N-1)
print(a)
print("It took %s milli seconds"%((time.time()-start)*100))
使用Hoare分区方案更适合使用中间值作为轴心,并且Hoare分区方案通常比问题中使用的Lomuto分区方案更快
def qsort(a, lo, hi):
if(lo >= hi):
return
p = a[(lo + hi) // 2] # pivot, any a[] except a[hi]
i = lo - 1
j = hi + 1
while(1):
while(1): # while(a[++i] < p)
i += 1
if(a[i] >= p):
break
while(1): # while(a[--j] < p)
j -= 1
if(a[j] <= p):
break
if(i >= j):
break
a[i],a[j] = a[j],a[i]
qsort(a, lo, j)
qsort(a, j+1, hi)
def qsort(a、lo、hi):
如果(低>=高):
返回
p=a[(lo+hi)//2]#枢轴,除a[hi]外的任何a[]
i=lo-1
j=高+1
而(一):
while(1):#while(a[++i]=p):
打破
while(1):#while(a[--j]
如上所述,如果仍要使用Lomuto分区方案,请将中间元素与最后一个元素交换,并使用代码与最后一个元素交换。无论中间位置是否为随机位置,最好将该元素移动到末尾,然后将其与从末尾选择元素作为轴心相同。如果没有这一步,索引是噩梦般的调试了吗?你的发现是什么。
def qsort(a, lo, hi):
if(lo >= hi):
return
p = a[(lo + hi) // 2] # pivot, any a[] except a[hi]
i = lo - 1
j = hi + 1
while(1):
while(1): # while(a[++i] < p)
i += 1
if(a[i] >= p):
break
while(1): # while(a[--j] < p)
j -= 1
if(a[j] <= p):
break
if(i >= j):
break
a[i],a[j] = a[j],a[i]
qsort(a, lo, j)
qsort(a, j+1, hi)