怎么实现中间元素为轴心的快速排序?

原学程将引见若何完成中央元素为轴心的疾速排序?的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

怎么实现中间元素为轴心的快速排序? 教程 第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个元素一路应用。

佳了闭于怎样完成中央元素为轴心的疾速排序?的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。