【问题标题】:Iterating quicksort steps - visualisation in turtle迭代快速排序步骤 - 乌龟中的可视化
【发布时间】:2019-06-06 14:32:00
【问题描述】:

我正在用TurtlePython3 中编写一个简单的应用程序。它可视化quicksort 算法。我想改进我的应用程序,以便通过等待用户点击来展示算法的每一步。

我在算法中间尝试了简单的input(),但这要求控制台在应用程序窗口进入后台时处于活动状态。 现在我正在尝试使用onscreenclick(),但是当算法到达某个点时,它会停止侦听鼠标事件。

我该怎么做?有没有其他方法可以做到这一点?

def partition(array, start, end):                  
    global clickedFlag
    pivotIndex = start                                  
    pivotValue = array[end]                             
    for i in range(start, len(array) - 1):              
        if array[i] < pivotValue:                       
            if clickedFlag:
                swap(array, i, pivotIndex)                  
                pivotIndex += 1                            
                clickedFlag = False                                     
            else:
                while clickedFlag == False:
                    onscreenclick(clicked)
                    listen()
    swap(array, pivotIndex, end)                        
    return pivotIndex

def clicked(x,y):
    global clickedFlag
    clickedFlag = True
    return clickedFlag

【问题讨论】:

    标签: python recursion quicksort turtle-graphics


    【解决方案1】:

    我建议您将“等待点击”逻辑集中在一个地方,而不是将其与其余的排序逻辑混为一谈。

    例如

    def waitForClick():
        global clickedFlag
        clickedFlag = False
        while clickedFlag == False:
             onscreenclick(clicked)
             listen()
    
    ...
        if array[i] < pivotValue: 
            waitForClick()
            swap(array, i, pivotIndex)                  
            pivotIndex += 1                            
    ...
    

    【讨论】:

    • 在循环中调用onscreenclick(clicked) 是没有意义的,它只是将处理函数与事件相关联。并且调用listen() 是没有意义的,因为它允许窗口接收keyboard 事件并且与鼠标点击无关。这个紧密的while 循环可能会阻止鼠标事件发生。
    • 我只是指出嵌入 UI 控件的处理逻辑过于复杂的问题。我对这些 UI 功能不够熟悉,无法解决这些问题。
    【解决方案2】:

    您对海龟图形中的鼠标事件有一个基本的误解。它们作为独立事件到达,您不能简单地停止正在运行的代码以等待事件发生。您的代码必须设计为响应事件。

    我相信更简单的Zelle Graphics 包可能更适合您的需求。 getMouse() 例程将停止您的程序并等待用户单击鼠标。

    在下面,我实现了您(已完成)代码的粗略可视化,该代码将混洗后的数组打印到控制台。在图形窗口中,从底部开始,中心索引处的值以红色显示在中心,其余数组值显示在两侧。当您在窗口中单击时,程序会前进,并且图形窗口会更新,直到在控制台窗口中打印出排序后的数组。再点击一下退出程序:

    from random import shuffle
    from graphics import *
    
    def swap(array, i, j):
        array[i], array[j] = array[j], array[i]
    
    def partition(array, start, end):
        global text
    
        pivotIndex = start
        pivotValue = array[end]
    
        for i in range(start, len(array) - 1):
            if array[i] < pivotValue:
    
                ##########################################
                # crude visualization example
                text = [obj.clone() for obj in text]
    
                left, pivot, right = text
    
                left.setText(str(array[:pivotIndex]))
                pivot.setText(str(array[pivotIndex]))
                right.setText(str(array[pivotIndex + 1:]))
    
                for obj in text:
                    obj.draw(window).move(0, -10)
    
                window.getMouse()                        #
                ##########################################
    
                swap(array, i, pivotIndex)
                pivotIndex += 1
    
        swap(array, pivotIndex, end)
        return pivotIndex
    
    def quickSort(array, low, high):
        if low < high:
            pivotIndex = partition(array, low, high)
    
            quickSort(array, low, pivotIndex - 1)
            quickSort(array, pivotIndex + 1, high)
    
    ########################################################################################
    # crude visualization setup
    window = GraphWin("Sorting Visualization", 800, 600)
    
    text = [Text(Point(200, 600), ""), Text(Point(400, 600), ""), Text(Point(600, 600), "")]
    text[1].setTextColor('red')                                                            #
    ########################################################################################
    
    array = list(range(20))
    shuffle(array)
    print(array)
    
    quickSort(array, 0, len(array) - 1)
    
    print(array)
    
    window.getMouse()
    window.close()
    

    【讨论】:

      猜你喜欢
      • 2015-07-02
      • 1970-01-01
      • 2021-05-03
      • 2020-08-14
      • 2020-06-12
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      相关资源
      最近更新 更多