可视化合并排序

Visualize the merge sort

我必须创建一个代码,让可视化合并排序的工作原理,使用 turtle 模块。这是我的代码

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,w,v[i]*r)
        x += w
     screen.update()

def mergeSort(arr, start, length):
    if length > 1:
        mergeSort(arr, start, 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, j, j+1, max(arr))
                turtle.update()
                j += 1
            k += 1
        while i < len(L):
            arr[start+k] = L[i]
            draw_bars(arr, j, j+1, max(arr))
            turtle.update()
            i += 1
            k += 1
        while j < len(R):
            arr[start+k] = R[j]
            draw_bars(arr, j, j+1, 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,0,len(a))

当我运行时,出现了一些问题,列表乱了,但好一点了。我认为归并排序算法有问题。有人知道错误吗?谁能帮我,o 尝试解释另一种方法来展示算法的工作原理?

为了达到这一点,我阅读了 geeks for geeks 页面:https://www.geeksforgeeks.org/merge-sort/, and the following question:

I think there is a problem in the merge sort algorithm.

问题似乎是你的半数组长度计算(用 length//2 代替 int(length/2):

mergeSort(array, start, length//2)
mergeSort(array, start + length//2, length//2)

第二个不正确,应该是:

mergeSort(array, start, length//2)
mergeSort(array, start + length//2, length - length//2)

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