基于快速排序算法的索引超出范围错误
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 )
我正在为快速排序算法制作一个可视化表示工具,我使用的是一个一维数组,它是一个随机范围的索引,填充了一个随机范围的值。我相信我在 运行 时间用来填充这个数组的方法导致了这个问题,因为我注意到它发生了大约 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 )