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