可视化归并排序

问题描述

我必须创建一个代码,使用乌龟模块来可视化合并排序的工作方式。这是我的代码

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)

否则你最终可能会失去一个。