Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.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_Recursion_Quicksort - Fatal编程技术网

Python 返回错误顺序的快速排序

Python 返回错误顺序的快速排序,python,recursion,quicksort,Python,Recursion,Quicksort,我正在Python中使用递归实现快速排序,而无需创建新变量来保存分区数组的左右部分 运行递归步骤时,我得到了错误的值。这就是我到目前为止所做的: def swap(a,i,j): tmp = a[i] a[i] = a[j] a[j] = tmp def pivot(a, lo, hi): mid = (lo + hi) // 2 # sort lo, mid, hi: if a[mid] < a[lo]: swap

我正在Python中使用递归实现快速排序,而无需创建新变量来保存分区数组的左右部分

运行递归步骤时,我得到了错误的值。这就是我到目前为止所做的:

def swap(a,i,j):
    tmp = a[i]
    a[i] = a[j]
    a[j] = tmp
    
def pivot(a, lo, hi):
    mid = (lo + hi) // 2
    # sort lo, mid, hi:
    if a[mid] < a[lo]:
        swap(a, lo, mid)
    if a[hi] < a[lo]:
        swap(a, lo, hi)
    if a[hi] < a[mid]:
        swap(a, mid, hi)

def partition(a, lo, hi):
    # place the pivot out of the way, in position hi -1 
    mid = (lo + hi)//2
    swap(a, mid, hi - 1)
    
    i = lo
    j = hi - 1
    pivot = a[j]
    
    while True:
        while True:
            i += 1
            if a[i] >= pivot: break
           
        while True:
            j -= 1
            if a[j] <= pivot: break
            
            
        if i >= j: break
        swap(a, i, j)
    swap(a, i, hi - 1)
    return i
你可以看到98放错地方了。如果我这样跑:

x = [9, 7, 5, 11, 12, 2, 14, 3, 10, 6, 55, 66, 888, 33, 556, 10]
quicksort(x)
print(x)
>>> [2, 3, 5, 6, 7, 9, 10, 10, 11, 12, 14, 33, 55, 66, 556, 888]
因此,对于上述情况,它是正确的。但在其他较小的情况下,它失败了:

x = [98, 33, 11, 556, 88]
quicksort(x)
print(x)
>>> [33, 11, 88, 556, 98]

有人能帮我找到错误吗?谢谢:-)

我看到两个错误,第一个错误在
分区()函数中

尝试用
swap(a,i,hi-1)
替换
swap(a,i,hi)

第二个在
\u sort()
中。最后一次调用应该是
\u sort(a,piv,右)

正确的代码是:

def partition(a, lo, hi):
    # place the pivot out of the way, in position hi -1 
    mid = (lo + hi)//2
    swap(a, mid, hi - 1)
    
    i = lo
    j = hi - 1
    pivot = a[j]
    
    while True:
        while True:
            i += 1
            if a[i] >= pivot: break
           
        while True:
            j -= 1
            if a[j] <= pivot: break
            
        if i >= j: break
        swap(a, i, j)
    swap(a, i, hi)
    return i
还有一些测试:

import random
for n in range(10):
    x = [random.randint(1,999) for i in range(random.randint(4,10))]
    quicksort(x)
    print(x)

[104, 226, 721, 769]
[131, 453, 590, 730, 752, 834]
[132, 156, 191, 277, 541, 599, 666, 909, 919]
[114, 210, 280, 919, 968, 978]
[127, 212, 381, 458, 585, 594, 685, 809, 935]
[73, 90, 189, 591, 599, 686, 806, 829, 831, 906]
[89, 115, 208, 601, 774, 813, 842, 981]
[159, 177, 203, 231, 621, 759, 950]
[347, 348, 417, 476, 850, 902]
[8, 50, 51, 483, 499, 696, 842]

金尼厄斯!非常感谢你!。无缝工作。
def partition(a, lo, hi):
    # place the pivot out of the way, in position hi -1 
    mid = (lo + hi)//2
    swap(a, mid, hi - 1)
    
    i = lo
    j = hi - 1
    pivot = a[j]
    
    while True:
        while True:
            i += 1
            if a[i] >= pivot: break
           
        while True:
            j -= 1
            if a[j] <= pivot: break
            
        if i >= j: break
        swap(a, i, j)
    swap(a, i, hi)
    return i
def _sort(a, left, right):
    if(left <  right):
        pivot(a, left, right)
        piv = partition(a, left, right)
        _sort(a, left, piv-1)
        _sort(a, piv, right)
x = [98, 33, 11, 556, 88]
quicksort(x)
print(x)
[11, 33, 88, 98, 556]
import random
for n in range(10):
    x = [random.randint(1,999) for i in range(random.randint(4,10))]
    quicksort(x)
    print(x)

[104, 226, 721, 769]
[131, 453, 590, 730, 752, 834]
[132, 156, 191, 277, 541, 599, 666, 909, 919]
[114, 210, 280, 919, 968, 978]
[127, 212, 381, 458, 585, 594, 685, 809, 935]
[73, 90, 189, 591, 599, 686, 806, 829, 831, 906]
[89, 115, 208, 601, 774, 813, 842, 981]
[159, 177, 203, 231, 621, 759, 950]
[347, 348, 417, 476, 850, 902]
[8, 50, 51, 483, 499, 696, 842]