繁体   English   中英

气泡排序和Python优化

[英]Bubble sort with optimization in Python

我是Python的新手,我从排序算法,PEP8和Python的Zen开始了我的旅程。 我刚刚在CodeReview上写了一篇文章。 我进行了修复,我想问一下优化气泡排序:第二个选项 我实现了优化气泡排序的第一个选项,但是第二个选项却有问题。 在Wikipedia中,它“使我们可以跳过很多元素,在最坏的情况下,可以使比较计数提高50%”。 因此,我的第一个选项代码如下所示:

def bubble_sort(container):
    """
        Bubble sort with optimization.

        Description
        ----------
        Performance cases:
        Worst      : O(n^2)
        Average    : O(n^2)
        Best case  : O(n)

        Parameters
        ----------
        data_container : Mutable structure with comparable objects and structure
                         which has implemented __len__, __getitem__ and __setitem__.

        Returns
        -------
        None

        Examples
        ----------
        >>> bubble_sort([7,1,2,6,4,2,3])
        [1, 2, 2, 3, 4, 6, 7]

        >>> bubble_sort(['a', 'c', 'b'])
        ['a', 'b', 'c']

    """

    # setting up variables
    length = len(container)
    changed = True

    while changed:
        changed = False
        for i in range(length - 1):
            if container[i] > container[i + 1]:
                container[i], container[i + 1] = container[i + 1], container[i]
                changed = True
        length -= 1

问题是我必须进行哪些更改才能实现优化的第二个选项。 另外,到目前为止,我已经尝试过像伪代码一样。 我的代码没有工作(没有排序),看起来像:

# setting up variables
length = len(container)

while length >= 1:
    number_of_changed = 0
    for i in range(1, length - 1):
        if container[i-1] > container[i]:
            container[i-1], container[i] = container[i], container[i-1]
            number_of_changed = i
    length = number_of_changed
container = [7,1,2,6,4,2,3]
length = len(container)

while length >= 1:
    num = 0
    for i in range(1, length):
        if container[i-1] > container[i]:
            container[i-1], container[i] = container[i], container[i-1]
            num = i
            print(num,'\n')
    length = num
    print(container)

我看到的问题是,您将范围设置为1到(length-1)->(7-1)为6,所以它将转到数组中的第6个元素。 因此,从for循环的长度中减去负1即可解决问题。 尝试将打印件放置在您认为可能会导致问题的位置,这将帮助您调试程序并告诉您所需的信息。 希望这可以帮助。

暂无
暂无

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

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