【问题标题】:A index out of range error based on quick sort algo基于快速排序算法的索引超出范围错误
【发布时间】:2021-12-30 14:00:01
【问题描述】:

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

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

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

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()

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

【问题讨论】:

  • 如果你使用调试器会发生什么

标签: python arrays indexing quicksort


【解决方案1】:

一定要研究什么是迭代器以及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 )

【讨论】:

  • 这段代码也会发生同样的错误,我一定要阅读更多关于迭代器的内容。我来自 web 开发,而且对编程还是很陌生,所以我有很多东西要学。
  • @zammystuff 我的示例代码中没有数组索引,因此不可能出现相同的错误,可能在不同的位置,使用调试器
  • 我以前从未使用过调试器,但从启用它并在启用所有断点的情况下运行,发生异常:IndexError list index out of range File "C:\Users\Ethans Laptop\OneDrive\ Desktop\gitRepo\visTool.py", line 34, initUI canvas.create_line(masterArray[x] + 20 ,1 ,masterArray[x]+ 20, masterArray[currValue] * 1 + 100) // 是输出。同样的地方,同样的错误。
  • 但我 110% 肯定我把事情搞砸了,我忽略了你告诉我的事情。我将重新阅读所有内容并尝试使其正常工作。
  • @zammystuff 为什么你认为我在答案中给你一个代码示例,不是忽略它而是尝试它,你的调试器错误仍然使用数组索引
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
  • 2016-09-08
  • 1970-01-01
  • 2022-01-10
  • 2016-09-08
相关资源
最近更新 更多