繁体   English   中英

我的快速排序算法实现中的错误

[英]Bug in my quick sort algorithm implementation

最近,我试图在Python中实现quicksort算法,但无法使其正常运行。 即使程序对子数组进行排序,也不会反映在主列表中。 我是编程新手,所以有人可以帮助我了解我做错了哪些部分或概念吗?

def swap(arr, right, left):
    temp = arr[right]
    arr[right] = arr[left]
    arr[left] = temp

def split_array(arr, right):
    left_half = arr[:right]
    right_half = arr[right:]
    a = (left_half, right_half)
    return a

def quick_sort(arr):
    if len(arr) >= 2:
        pivot = 0
        left_mark = pivot + 1
        right_mark = len(arr) - 1
        stop = True

        while stop:
            while arr[pivot] > arr[left_mark] and left_mark < right_mark:
                left_mark += 1
            while arr[pivot] < arr[right_mark] and left_mark < right_mark:
                right_mark -= 1
            if left_mark < right_mark:
                swap(arr, right_mark, left_mark)
                right_mark -= 1
                left_mark += 1
            else:
                if arr[pivot] > arr[right_mark]:
                    swap(arr, right_mark, pivot)
                stop = False
        left, right = split_array(arr, right_mark)
        quick_sort(left)
        quick_sort(right)
    return arr

array = [8, 6, 1, 7, 0, 5, 4, 3, 2, 1]
print(quick_sort(array))

更改此:

left, right = split_array(arr, right_mark)
quick_sort(left)
quick_sort(right)

对此:

left, right = split_array(arr, right_mark)
arr = quick_sort(left) + quick_sort(right)

Quicksort通常是“就地”实现的,以避免在周围复制阵列。 您的实现会在每个步骤中创建数组的完整副本并返回它,因此您需要自己重新组装各个部分。

更新

进行一下小的更改以使您的算法就位:

def quick_sort(arr, start=0, end=None):
    if end is None: end = len(arr)-1
    if end > start:
        pivot = start
        left_mark = start + 1
        right_mark = end
        stop = True

        while stop:
            while arr[pivot] > arr[left_mark] and left_mark < right_mark:
                left_mark += 1
            while arr[pivot] < arr[right_mark] and left_mark < right_mark:
                right_mark -= 1
            if left_mark < right_mark:
                swap(arr, right_mark, left_mark)
                right_mark -= 1
                left_mark += 1
            else:
                if arr[pivot] > arr[right_mark]:
                    swap(arr, right_mark, pivot)
                stop = False
        quick_sort(arr, start, right_mark - 1)
        quick_sort(arr, right_mark, end)

array = [8, 6, 1, 7, 0, 5, 4, 3, 2, 1]
quick_sort(array) # in-place
print(array) # now sorted

IMO,以下内容更加清楚,并且与算法的典型描述更加匹配:

def quick_sort(arr, start=0, end=None):
    if end is None:
        end = len(arr) - 1

    if end <= start:
        return

    pivot = arr[start]
    left_mark = start - 1
    right_mark = end + 1

    while left_mark < right_mark:
        left_mark += 1
        while arr[left_mark] < pivot:
            left_mark += 1

        right_mark -= 1
        while arr[right_mark] > pivot:
            right_mark -= 1

        if left_mark < right_mark:
            arr[left_mark], arr[right_mark] = arr[right_mark], arr[left_mark]

    quick_sort(arr, start, right_mark)
    quick_sort(arr, right_mark + 1, end)

你说得对! leftrightsplit_array之后的单独实体,不是原始arr quick_sort(right) ,说arr=left+right 我认为这可以做到。 (需要检查leftright只有一个元素时的情况。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM