Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
132 views
in Technique[技术] by (71.8m points)

Python Sorting Algorithm Visualiser Heap Sort Error after Heapification (Tkinter)

I'm making a sorting algorithm visualizer in Python using the Tkinter library. There is a problem that's coming in heapsort. I've covered most of the other algorithms pretty easily except this one.

I'm able to do the first heapification pretty easily but then this error comes:-

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:Program FilesWindowsAppsPythonSoftwareFoundation.Python.3.9_3.9.496.0_x64__qbz5n2kfra8p0libkinter\__init__.py", line 1884, in __call__
    return self.func(*args)
  File "C:UserssrivaDesktopMy FolderProjectsSorting-Algorithm-VisualizersortingAlgo.py", line 63, in startAlgorithm
    heap_sort(data, drawData, speedScale.get())
  File "C:UserssrivaDesktopMy FolderProjectsSorting-Algorithm-Visualizerheapsort.py", line 27, in heap_sort
    heapify(data, i, 0, drawData, timetick)
  File "C:UserssrivaDesktopMy FolderProjectsSorting-Algorithm-Visualizerheapsort.py", line 4, in heapify
    drawData(data, ['yellow' if x==i else 'red' for x in range(n)])
  File "C:UserssrivaDesktopMy FolderProjectsSorting-Algorithm-VisualizersortingAlgo.py", line 34, in drawData
    canvas.create_rectangle(x0,y0,x1,y1,fill=colorArray[i])
IndexError: list index out of range

Here is my code for heap sort:-

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)

And here is the code for the drawData function:-

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)

question from:https://stackoverflow.com/questions/66058812/python-sorting-algorithm-visualiser-heap-sort-error-after-heapification-tkinter

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)
Waitting for answers

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...