迭代快速排序步骤在tu中可视化

2024-09-27 00:23:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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

Tags: 算法false应用程序ifdefarrayglobalstart
2条回答

我建议您将“等待单击”逻辑集中在一个地方,而不要将其与其他排序逻辑混合。你知道吗

例如

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

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

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

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

相关问题 更多 >

    热门问题