【问题标题】:Python- How to implement quick sort when middle element is the pivot?Python-当中间元素是枢轴时如何实现快速排序?
【发布时间】:2021-04-19 19:32:20
【问题描述】:

有许多不同版本的 quickSort 以不同的方式选择轴。

  • 始终选择第一个元素或最后一个元素作为枢轴
  • 选择一个随机元素作为基准。
  • 选择中位数作为支点。

我已经使用 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-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))

这是输出

[88, 35, 55, 68, 96, 23, 44, 77, 78, 71]
[35, 55, 23, 68, 44, 77, 88, 96, 78, 71]
It took 1.5625953674316406 milli seconds

【问题讨论】:

  • 无论随机位置的中间,你最好将该元素移动到末尾,然后它与从末尾选择元素作为枢轴相同。如果没有这一举措,索引将是一场噩梦
  • 试过调试了吗?你的发现是什么。

标签: python algorithm sorting quicksort


【解决方案1】:

使用 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)

如上所述,如果您仍想使用 Lomuto 分区方案,请将中间元素与最后一个元素交换,并将您的代码与最后一个元素一起使用。

【讨论】:

    猜你喜欢
    • 2017-07-11
    • 2019-11-23
    • 2023-03-04
    • 1970-01-01
    • 2017-03-12
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    相关资源
    最近更新 更多