【问题标题】:Bubble sort implementation from Pseudocode来自伪代码的冒泡排序实现
【发布时间】:2018-09-10 15:55:20
【问题描述】:

这是我的伪代码

Procedure
    i <- n
    last <- 1
    while i > last do
        for j <- 1 to i-1 do
            if t[j] > t[j+1] do
               t[j] <-> t[j+1] {switch values}
               last <- j
            end if
        end for
        i <- last
        last <- 1
    end while
 end

我只需要说明为什么这是对标准冒泡排序的改进并跟踪算法。我能应付的。为了进行一些测试和学习目的,我决定用 python 编写代码。我的实现不起作用。

def bubbleSort(arr):
    n = len(arr)
    i = n
    last = 1

    while (i > last):
        for j in range(0, i-1):
            if arr[j] > arr[j+1] :
                arr[j], arr[j+1] = arr[j+1], arr[j]
                last = j
        i = last
        last = 1

# Driver code to test above
arr = [5, 3, 89, 100, -4, 7, 45]

bubbleSort(arr)

我得到的输出是 3 ,5 ,89,-4 ,7 ,45 ,100 女巫意味着它只在内部循环中执行第一遍,但之后立即停止。

我从伪代码中翻译错了吗?

【问题讨论】:

    标签: python pseudocode bubble-sort


    【解决方案1】:

    这是你的答案。

    def bubbleSort(arr):
        n = len(arr)
        i = n
        last = 1
    
        while (i > last):
            for j in range(0, i-1):
                if arr[j] > arr[j+1] :
                    arr[j], arr[j+1] = arr[j+1], arr[j]
            i = i - 1
    
    # Driver code to test above
    arr = [5, 3, 89, 100, -4, 7, 45]
    
    bubbleSort(arr)
    

    【讨论】:

    • 问题是你永远不会在你的内部循环中使用 last ,所以从来没有真正需要使用它。其次,你想遍历列表,所以你想从 n 开始递减 1
    • 是的,我需要在内部循环中使用 last 。我更新了伪代码。您的冒泡排序工作得很好,但使用额外变量的 pswudocode 版本应该使排序更有效。
    • 哦,我明白你在做什么了。如果你看这个,他们会很好地解释如何使用额外的变量。 stackoverflow.com/questions/16195092/optimized-bubble-sort-java
    • 是的,我看到了那个。他们添加的额外变量仅用于检查内部循环的整个传递是否在没有交换的情况下结束。如果发生这种情况,我们知道数组已经排序并退出。为赋值提供的伪代码似乎没有这样做。
    【解决方案2】:

    你在while循环中做的最后一件事是

    i = last
    last = 1
    

    由于last 从 1 开始,在第一次迭代之后,这将使 ilast 都为 1。因此,while (i &gt; last) 条件失败并且循环退出。

    为了更清楚地看到这一点,这是您的代码,其中只有相关部分:

    def bubbleSort(arr):
        i = len(arr)
        last = 1
        while (i > last):
            i = last
            last = 1
    

    您可能需要重新阅读伪代码,看看它是否真的如其所说。

    【讨论】:

    • 我在创建帖子时错过了伪代码中的重要行。最后取内循环中 j 的值。我编辑了 OP。
    猜你喜欢
    • 1970-01-01
    • 2017-03-11
    • 2012-07-23
    • 2011-08-02
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多