📜  排序算法可视化:归并排序(1)

📅  最后修改于: 2023-12-03 15:25:55.950000             🧑  作者: Mango

排序算法可视化:归并排序

算法简介

归并排序为一种分治法排序算法。其基本思想是将待排序数组分成两个长度相等的子数组,对每个子数组进行排序,然后将两个已排序的子数组合并成一个有序的数组。归并排序的时间复杂度为O(nlogn),相较于其他排序算法具有更好的稳定性和合并性。

可视化实现

下面是一个基于Python语言的归并排序可视化程序,使用了Tkinter库进行GUI界面的绘制,使用递归进行归并排序并在图形界面上展示排序过程。

import tkinter as tk
import random
import time


class MergeSortVisualizer:
    def __init__(self, data):
        self.data = data
        self.n = len(data)
        self.width = 600
        self.height = 400
        self.interval = self.width / self.n
        self.root = tk.Tk()
        self.root.title("Merge Sort Visualizer")
        self.canvas = tk.Canvas(self.root, width=self.width, height=self.height)
        self.canvas.pack()
        self.root.update()
    
    def draw(self):
        self.canvas.delete('all')
        for i, val in enumerate(self.data):
            x0 = i * self.interval
            y0 = self.height - val * (self.height / self.n)
            x1 = (i + 1) * self.interval
            y1 = self.height
            self.canvas.create_rectangle(x0, y0, x1, y1, fill='blue')
    
    def merge(self, start, mid, end):
        p = start
        q = mid + 1
        tmp = []
        for i in range(start, end+1):
            if p > mid:
                tmp.append(self.data[q])
                q += 1
            elif q > end:
                tmp.append(self.data[p])
                p += 1
            elif self.data[p] < self.data[q]:
                tmp.append(self.data[p])
                p += 1
            else:
                tmp.append(self.data[q])
                q += 1
        self.data[start:end+1] = tmp
        self.draw()
        time.sleep(0.1)
    
    def merge_sort(self, start, end):
        if start >= end:
            return
        mid = (start + end) // 2
        self.merge_sort(start, mid)
        self.merge_sort(mid+1, end)
        self.merge(start, mid, end)
    
    def start(self):
        self.draw()
        self.root.update()
        self.merge_sort(0, self.n-1)
        self.draw()
        self.root.update()
        self.root.mainloop()


if __name__ == '__main__':
    data = [random.randint(1, 100) for _ in range(50)]
    sorter = MergeSortVisualizer(data)
    sorter.start()
运行结果

Merge Sort Visualizer

我们可以看到,在图形界面上对一个50个元素随机数组进行了归并排序,并且在每次排序过程中绘制了当前数组的状态,使得排序过程更加直观化。