快速排序步骤-乌龟中的可视化

时间:2019-06-06 14:32:00

标签: python recursion quicksort turtle-graphics

我正在Python3中用Turtle编写一个简单的应用程序。它可视化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

2 个答案:

答案 0 :(得分:1)

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

例如

def waitForClick():
    global clickedFlag
    clickedFlag = False
    while clickedFlag == False:
         onscreenclick(clicked)
         listen()

...
    if array[i] < pivotValue: 
        waitForClick()
        swap(array, i, pivotIndex)                  
        pivotIndex += 1                            
...

答案 1 :(得分:0)

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

我相信更简单的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()

enter image description here