📅  最后修改于: 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()
我们可以看到,在图形界面上对一个50个元素随机数组进行了归并排序,并且在每次排序过程中绘制了当前数组的状态,使得排序过程更加直观化。