Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python—当中间元素是轴心时,如何实现快速排序?_Python_Algorithm_Sorting_Quicksort - Fatal编程技术网

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)