【问题标题】:What's wrong with this quicksort code (Python)?这个快速排序代码(Python)有什么问题?
【发布时间】:2021-05-12 08:41:03
【问题描述】:

这是用 Python3 编写的。这是代码:

def partition(arr, l, h):
pivot = arr[l]
i = l+1
j = h
while i <= j:
    print('i is ', i)
    print('j is ', j)
    while arr[i] < pivot:
        i += 1
    while arr[j] > pivot:
        j -= 1
    arr[i], arr[j] = arr[j], arr[i]

# Placing the pivot at its sorted position
arr[j], arr[l] = pivot, arr[j]
return j


def quicksort(arr, l, h):
    if l >= h:
        return arr
    p = partition(arr, l, h)
    print('p is ', p)
    quicksort(arr, l, p-1)
    quicksort(arr, p+1, h)


test = [4, 2, 7, 1]
sorted_test = quicksort(test, 0, len(test)-1)
print(sorted_test)

这是输出 -

根据错误,arr[i] 超出范围,但变量“i”如何达到该值? 我知道还有其他方法可以实现这一点,但我在这里做错了什么?

【问题讨论】:

  • 看起来您正在增加i,直到它超出您的列表末尾并尝试访问arr[i]
  • @khelwood 是的,我想通了。但我不明白这是怎么回事。变量“i”不应达到该值。
  • 好的。那么当您拥有while arr[i] &lt; pivot: i += 1 时,什么会阻止i 达到该值?
  • @khelwood while i&lt;=j 将确保 i 不超过 j 。而 j 可以保持的最大值是len(arr)-1 我想错了吗?
  • 但是while i&lt;=j 不会打断while arr[i] &lt; pivot: i += 1。直到下一次外循环重复时,才会再次检查外循环条件。

标签: python python-3.x algorithm sorting quicksort


【解决方案1】:

这里是代码

def partition(arr, low, high):
    i = (low-1)         # index of smaller element
    pivot = arr[high]     # pivot
  
    for j in range(low, high):
  
        # If current element is smaller than or
        # equal to pivot
        if arr[j] <= pivot:
  
            # increment index of smaller element
            i = i+1
            arr[i], arr[j] = arr[j], arr[i]
  
    arr[i+1], arr[high] = arr[high], arr[i+1]
    return (i+1)
  
# The main function that implements QuickSort
# arr[] --> Array to be sorted,
# low  --> Starting index,
# high  --> Ending index
  
# Function to do Quick sort
  
  
def quickSort(arr, low, high):
    if len(arr) == 1:
        return arr
    if low < high:
  
        # pi is partitioning index, arr[p] is now
        # at right place
        pi = partition(arr, low, high)
  
        # Separately sort elements before
        # partition and after partition
        quickSort(arr, low, pi-1)
        quickSort(arr, pi+1, high)
  
  
# Driver code to test above
arr = [10, 7, 8, 9, 1, 5]
n = len(arr)
quickSort(arr, 0, n-1)
test = [4, 2, 7, 1]
quicksort(test, 0, len(test)-1)

print("Sorted array is:")
for i in range(len(test)):
    print("%d" % test[i])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-14
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多