我正在尝试使用两种方法(交换、磁区)实作递回快速排序算法,同时在 lambda 表达式中使用递回运行主演算法。我得到一个无限递回错误,老实说我找不到语法错误。有人可以帮我吗?谢谢 :)
def swap(array, a, b):
        array[a], array[b] = array[b], array[a]
def partition(array, high, low):
    pivot = array[high]
    i = low
    for x in range(low, high-1):
        if array[x] < pivot:
            i =1
            swap(array, array[x], array[high])
    return i
g = lambda array, low, high: g(array,low,partition(array,high,low)-1) g(array,partition(array,high,low) 1,high) if low < high else print("not sorted")
uj5u.com热心网友回复:
有几个问题partition:
- 呼叫 - swap是从您的串列中传递值,而不是索引。
- 即使先前的错误被纠正,它也会将枢轴值移动到 - low 1索引中,或者根本不会移动。
- 回传的 index - i应该是枢轴移动的位置。在正确的实作中,这意味着- i值被移动到的最后一个索引,即 index 处的值- high。这不是正在发生的事情,因为第一次交换已经移动了枢轴值。
- 交换应该是当前值和 at 的值 - i,因此直到索引 at 的所有值- i都小于或等于枢轴值。
这是修正后的partition函式:
def partition(array, high, low):
    pivot = array[high]
    i = low - 1
    for x in range(low, high 1):
        if array[x] <= pivot:
            i =1
            swap(array, x, i)
    return i
这些是函式中的问题g:
- 它应该就地执行排序,因此 - else) 不回传任何内容,因此- partition(array,high,low)被呼叫两次,这不仅是浪费,而且第二次呼叫在大多数情况下会回传不同的结果,因为枢轴可以不同。这意味着第二次呼叫- g可能不适用于相邻磁区,但会留下(未排序的)间隙,或者在重叠磁区上作业。
这是对功能的更正g:
def g(array, low, high):
    if low < high:
        i = partition(array, high, low)
        g(array, low, i-1)
        g(array, i 1, high)
您还应该考虑使用比 更好的名称g,并更改high/low自变量的顺序partition: 颠倒顺序是混淆代码读者的好方法。
uj5u.com热心网友回复:
这是Hoare在 Python 中实作的快速排序算法-
def quicksort(A, lo, hi):
  if lo >= 0 and hi >= 0 and lo < hi:
    p = partition(A, lo, hi)
    quicksort(A, lo, p)
    quicksort(A, p   1, hi)
def partition(A, lo, hi):
  pivot = A[(hi   lo) // 2]
  i = lo
  j = hi
  while True:
    while A[i] < pivot:
      i  = 1
    while A[j] > pivot:
      j -= 1
    if i >= j:
      return j
    swap(A, i, j)
def swap(A, i, j):
  A[i], A[j] = A[j], A[i]
如果你愿意,你可以写gusing lambda,但我建议改为def使用普通函式 -
g = lambda a: quicksort(a, 0, len(a) - 1)
给定一个样本输入,x-
x = [5,0,9,7,4,2,8,3,1,6]
g(x)
print(x)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
如果您想计算使用的比较和交换的数量,请参阅此相关问答。

 
							 
										
										 
										
										 
										
										
										 
										
										 
										
										 
										
										
0 评论