基于快速排序算法的索引超出范围错误

A index out of range error based on quick sort algo

我正在为快速排序算法制作一个可视化表示工具,我使用的是一个一维数组,它是一个随机范围的索引,填充了一个随机范围的值。我相信我在 运行 时间用来填充这个数组的方法导致了这个问题,因为我注意到它发生了大约 50% 的时间,但我无法确定值之间的任何 causation/correlation索引的数量,或者会 return 这个错误的数组的长度:

canvas.create_line(masterArray[x] + 20 ,1 ,masterArray[x]+ 20, masterArray[currValue] * 1 + 100)
IndexError: list index out of range

我将在下面附上代码。我的理论是,一些正在填充的值没有为要绘制的线提供足够的信息,即:x 起点、y 起点、x 终点和 y 终点。不幸的是,我想不出我当前系统的任何值都不会提供此信息。如果有人有任何想法,我真的很感激在正确的方向上轻推。

from tkinter import Tk, Canvas, Frame, BOTH, W
import random
import numpy as np
randInt = random.randint(10, 100)
masterArray = [random.randint(10,75) for _ in range(randInt)]
print(randInt)
print(masterArray)

    class Example(Frame):
    
        def __init__(self):
            super().__init__()
    
            self.initUI()
    
        def initUI(self):
    
            self.master.title("Lines")
            self.pack(fill=BOTH, expand=1)
            sortedArr =quicksort(masterArray)
    
    
            canvas = Canvas(self)
            ##canvas.create_text(100,100, anchor=W , font ="Purisa", text = len(masterArray))
            for x in masterArray:
                currValue = masterArray[x]
                canvas.create_line(masterArray[x] + 20 ,1 ,masterArray[x]+ 20, masterArray[currValue] * 1 + 100)
            
            for x in sortedArr:
                currValue = sortedArr[x]
                canvas.create_line(sortedArr[x] + 20 ,500,sortedArr[x]+ 20, 500 - sortedArr[currValue] - 100 )
                ##canvas.create_line(x start,ystart ,x end, y end)
    
            canvas.create_text(125, 250, anchor=W, font="Purisa",text = "The total number of elements is: " + str(len(masterArray)))
            
            ##canvas.create_line(15, 25, 200, 25)
            ##canvas.create_line(300, 35, 300, 200, dash=(4, 2))
           ## canvas.create_line(55, 85, 155, 85, 105, 180, 55, 85)
    
            canvas.pack(fill=BOTH, expand=1)
    
    def quicksort(arr):
        elements = len(arr)
        if elements < 2:
            return arr
        current_pos = 0
    
        for i in range(1, elements):
            if arr[i] <= arr[0]:
                current_pos += 1
                temp = arr[i]
                arr[i] = arr[current_pos]
                arr[current_pos] = temp
        
        temp = arr[0]
        arr[0] = arr[current_pos]
        arr[current_pos] = temp
        left = quicksort(arr[0:current_pos])
        right = quicksort(arr[current_pos+1:elements])
        arr = left +[arr[current_pos]] + right
        
        
        return arr
    
    def main():
       
        root = Tk()
        ex = Example()
        root.geometry("500x500+300+300")
        root.mainloop()
    
    
    if __name__ == '__main__':
        main()

我已经尝试使用随机值参数来查看是否有任何改进,但到目前为止还没有成功。我感谢任何帮助。谢谢

一定要研究迭代器是什么以及for的作用:

像这样更好:

for x,currValue in enumerate(masterArray):
    canvas.create_line(x + 20 ,1 ,x + 20, currValue * 1 + 100)

for x,currValue in enumerate(sortedArr):
    canvas.create_line(x + 20 ,500, x+ 20, 500 - currValue - 100 )