Python排序算法可视化程序堆化后堆排序错误(Tkinter)

2024-09-30 10:36:54 发布

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

我正在使用Tkinter库用Python制作一个排序算法可视化工具。heapsort出现了一个问题。除此之外,我已经很容易地介绍了大多数其他算法

我可以很容易地进行第一次heapification,但随后出现了以下错误:-

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.496.0_x64__qbz5n2kfra8p0\lib\tkinter\__init__.py", line 1884, in __call__
    return self.func(*args)
  File "C:\Users\sriva\Desktop\My Folder\Projects\Sorting-Algorithm-Visualizer\sortingAlgo.py", line 63, in startAlgorithm
    heap_sort(data, drawData, speedScale.get())
  File "C:\Users\sriva\Desktop\My Folder\Projects\Sorting-Algorithm-Visualizer\heapsort.py", line 27, in heap_sort
    heapify(data, i, 0, drawData, timetick)
  File "C:\Users\sriva\Desktop\My Folder\Projects\Sorting-Algorithm-Visualizer\heapsort.py", line 4, in heapify
    drawData(data, ['yellow' if x==i else 'red' for x in range(n)])
  File "C:\Users\sriva\Desktop\My Folder\Projects\Sorting-Algorithm-Visualizer\sortingAlgo.py", line 34, in drawData
    canvas.create_rectangle(x0,y0,x1,y1,fill=colorArray[i])
IndexError: list index out of range

以下是我的堆排序代码:-

import time

def heapify(data, n, i, drawData, timetick):
    drawData(data, ['yellow' if x==i else 'red' for x in range(n)])
    time.sleep(timetick)
    largest = i
    left = 2*i+1
    right = 2*i+2

    if left < n and data[i] < data[left]:
        largest = left
    if right < n and data[largest] < data[right]:
        largest = right

    if largest != i:
        data[i], data[largest] = data[largest], data[i]
        heapify(data, n, largest, drawData, timetick)


def heap_sort(data, drawData, timetick):
    n = len(data)
    for i in range(n//2, -1, -1):
        heapify(data, n, i, drawData, timetick)

    for i in range(n-1, 0, -1):
        data[i], data[0] = data[0], data[i]
        heapify(data, i, 0, drawData, timetick)
        drawData(data, ['green' if x > i else 'yellow' if x==i else 'red' for x in range(n)])
        time.sleep(timetick)

以下是drawData函数的代码:-

from tkinter import *
from tkinter import ttk 
import random
from heapsort import heap_sort

root = Tk()
root.title('Sorting ALgorithm Visualization')
root.maxsize(1100, 700)
root.config(bg="black")

#variables
selected_algo = StringVar()
data = []

def drawData(data, colorArray):
    canvas.delete("all")
    c_width=750
    c_height=700
    x_width=c_width/(len(data)+1)
    offset = 30
    spacing = 0
    normalizedData = [i/max(data) for i in data]
    for i, height in enumerate(normalizedData):
        x0 = i * x_width + offset + spacing
        y0 = c_height - height * 660 
        x1 = (i+1)*x_width+offset
        y1 = c_height
        canvas.create_rectangle(x0,y0,x1,y1,fill=colorArray[i])
        canvas.create_text(x0+2, y0, anchor=SW, text=str(data[i]))
    
    root.update_idletasks()

def Generate():
    global data
    minVal = int(minEntry.get())
    maxVal = int(maxEntry.get())
    size = int(sizeEntry.get())
    
    data = []
    for _ in range(size):
        data.append(random.randrange(minVal, maxVal+1))
    drawData(data, ['red' for x in range(len(data))])

def startAlgorithm():
    global data
    if not data: return
    if algMenu.get() == 'Heap Sort':
        heap_sort(data, drawData, speedScale.get())
    
    drawData(data, ['green' for x in range(len(data))])

#frame
ui_frame = Frame(root, width=250, height=700, bg='grey')
ui_frame.grid(row=0, column=0)
ui_frame.grid_propagate(0)

canvas = Canvas(root, width=800, height=700, bg='white')
canvas.grid(row=0, column=1)

Label(ui_frame, text="Algorithm", bg='grey').grid(row=0, column=0, padx=5, pady=(50,10))
algMenu = ttk.Combobox(ui_frame,  textvariable=selected_algo, width=15, values=['Heap Sort'])
algMenu.grid(row=0, column=1, padx=5, pady=(50, 10))
algMenu.current(0)


Tags: infordatagetifrangerootwidth

热门问题