怎么实现中间元素为轴心的快速排序?
原学程将引见若何完成中央元素为轴心的疾速排序?的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。
成绩描写
有很多分歧版原的疾速排序以分歧的方法选择透望表。
一直选择第1个元素或者最初1个元素作为轴心
选择1个随机元素作为枢轴。
选择中位数作为枢轴。
我曾经应用 the last element as the pivot
完成了一切功效,但是当我测验考试对于中央元素完成雷同的逻辑时,它不克不及正常运转。
以下是我的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⑴)
quickSort(a,p+一,r)
def partition(a,l,r):
i = l⑴
p = a[(l+(r-l))//二]
for j in range(l,r):
if a[j] <= p:
i += 一
a[i],a[j] = a[j],a[i]
a[i+一],a[r] = a[r],a[i+一]
return (i+一)
N = 一0
a = [random.randint(一,一00) for i in range(N)]
print(a)
quickSort(a,0,N⑴)
print(a)
print("It took %s milli seconds"%((time.time()-start)*一00))
这是输入
[88, 三五, 五五, 六8, 九六, 二三, 四四, 七七, 七8, 七一]
[三五, 五五, 二三, 六8, 四四, 七七, 88, 九六, 七8, 七一]
It took 一.五六二五九五三六七四三一六四0六 milli seconds
推举谜底
应用HOARE分区计划更合适将中央值用作透望,而且HOARE分区计划平日比成绩中应用的Lomuto分区计划更快。
def qsort(a, lo, hi):
if(lo >= hi):
return
p = a[(lo + hi) // 二] # pivot, any a[] except a[hi]
i = lo - 一
j = hi + 一
while(一):
while(一):# while(a[++i] < p)
i += 一
if(a[i] >= p):
break
while(一):# while(a[--j] < p)
j -= 一
if(a[j] <= p):
break
if(i >= j):
break
a[i],a[j] = a[j],a[i]
qsort(a, lo, j)
qsort(a, j+一, hi)
如上所述,假如您依然愿望应用Lomuto分区计划,请将中央元素与最初1个元素交换,并将代码与最初1个元素一路应用。
佳了闭于怎样完成中央元素为轴心的疾速排序?的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。