问题描述
我必须创建一个代码,使用乌龟模块来可视化合并排序的工作方式。这是我的代码
import turtle
from random import randint
import time
def draw_bar(x,y,w,h):
turtle.up()
turtle.goto(x,y)
turtle.seth(0)
turtle.down()
turtle.begin_fill()
turtle.fd(w)
turtle.left(90)
turtle.fd(h)
turtle.left(90)
turtle.fd(w)
turtle.left(90)
turtle.fd(h)
turtle.left(90)
turtle.end_fill()
def draw_bars(v,currenti=-1,currentj=-1,M=500):
turtle.clear()
x = -250
n = len(v)
w = 500/n
r = 500/M
for i in range(n):
if i == currenti: turtle.fillcolor('red')
elif i == currentj: turtle.fillcolor('blue')
else: turtle.fillcolor('gray')
draw_bar(x,-250,v[i]*r)
x += w
screen.update()
def mergeSort(arr,start,length):
if length > 1:
mergeSort(arr,int(length/2))
mergeSort(arr,start+int(length/2),int(length/2))
L = arr[start:start+int(length/2)]
R = arr[start+int(length/2):start+length]
i=0
j=0
k=0
while i < len(L) and j < len(R):
if L[i] < R[j]:
arr[start+k] = L[i]
draw_bars(arr,j,j+1,max(arr))
turtle.update()
i += 1
else:
arr[start+k] = R[j]
draw_bars(arr,max(arr))
turtle.update()
j += 1
k += 1
while i < len(L):
arr[start+k] = L[i]
draw_bars(arr,max(arr))
turtle.update()
i += 1
k += 1
while j < len(R):
arr[start+k] = R[j]
draw_bars(arr,max(arr))
turtle.update()
j += 1
k += 1
screen = turtle.Screen()
screen.setup(600,600)
screen.tracer(0,0)
screen.title('Grafica')
turtle.speed(0)
turtle.hideturtle()
a = [randint(0,100) for i in range(90)]
mergeSort(a,len(a))
我跑的时候,出了点问题,列表乱了,不过好一点。我认为归并排序算法有问题。有人知道错误吗?有人可以帮助我吗?尝试解释另一种方法来展示算法的工作原理吗?
为了达到这一点,我阅读了 geeks for geeks 页面:https://www.geeksforgeeks.org/merge-sort/,以及以下问题:Visualize MergeSort in Python
解决方法
我认为归并排序算法有问题。
问题似乎是你的半数组长度计算(用 length//2
代替 int(length/2)
:
mergeSort(array,start,length//2)
mergeSort(array,start + length//2,length//2)
第二个不正确,应该是:
mergeSort(array,length - length//2)
否则你最终可能会失去一个。