在Python中可视化合并排序

在Python中可视化合并排序,python,mergesort,Python,Mergesort,我想用python制作一个mergesort可视化工具。我想使用海龟模块。要绘制单个条形图,我使用函数draw_-bar,要绘制整个阵列,则使用函数draw_-bar。这是密码 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)

我想用python制作一个mergesort可视化工具。我想使用海龟模块。要绘制单个条形图,我使用函数draw_-bar,要绘制整个阵列,则使用函数draw_-bar。这是密码

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):
    if len(arr) > 1:
        mid = len(arr)//2
        L = arr[:mid]
        R = arr[mid:]
        mergeSort(L)
        mergeSort(R)
        i=0
        j=0
        k=0
        while i < len(L) and j < len(R):
            if L[i] < R[j]:
                arr[k] = L[i]
                i += 1
            else:
                arr[k] = R[j]
                j += 1
            k += 1
        while i < len(L):
            arr[k] = L[i]
            i += 1
            k += 1
        while j < len(R):
            arr[k] = R[j]
            j += 1
            k += 1
def合并排序(arr):
如果len(arr)>1:
mid=len(arr)//2
L=arr[:中间]
R=arr[mid:]
合并排序(L)
合并排序(R)
i=0
j=0
k=0
而i

现在我需要知道如何放置刷新可视化列表的代码部分。

您需要在每次数组更改时更新您的grafics,意思是在每次
arr[k]=L[j]

但是,在当前的实现中很难做到这一点,因为递归函数没有关于它操作的较大列表的哪一部分的信息

我建议更改函数,以便始终将completat数组以及开始索引和要处理的部分的长度传递给它:

def mergeSort(arr, start, length):
    if length > 1:
        mergeSort(arr, start, length/2)
        mergeSort(arr, start+length/2, length/2)
        etc.
然后,每次阵列发生变化时,您都可以调用
牵引杆

编辑: 完整代码如下所示:

def mergeSort(arr, start, length):
    if length > 2:
        mergeSort(arr, start, int(length/2))
        mergeSort(arr, start+int(length/2), int(length/2))
    
    print(start+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(myarray)
            i += 1
        else:
            arr[start+k] = R[j]
            draw_bars(myarray)
            j += 1
        k += 1
    while i < len(L):
        arr[start+k] = L[i]
        draw_bars(myarray)
        i += 1
        k += 1
    while j < len(R):
        arr[start+k] = R[j]
        draw_bars(myarray)
        j += 1
        k += 1
        
myarr = [2,345,2456,3456,56,34,5,78,34,5423,26487,324,1,3,4,5]
draw_bars(myarray)
mergeSort(myarr, 0 ,len(myarr))
print(myarr)
def合并排序(arr、start、length):
如果长度>2:
合并排序(arr、start、int(长度/2))
合并排序(arr、start+int(长度/2)、int(长度/2))
打印(起始+整数(长度/2))
L=arr[start:start+int(长度/2)]
R=arr[start+int(长度/2):start+length]
i=0
j=0
k=0
而i
我不知道你是什么意思。你能举个例子或者展示一个伪代码吗?ThanksI很快实现了该功能。