前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于python排序算法可视化一

关于python排序算法可视化一

作者头像
python与大数据分析
发布2022-03-11 13:59:34
2390
发布2022-03-11 13:59:34
举报
文章被收录于专栏:python与大数据分析

排序算法可视化,包含了两个部分,一个是排序算法,一个是可视化。

排序算法本身就是个大难题,包括冒泡排序,选择排序,插入排序,希尔排序,归并排序,快速排序,基数排序,堆排序,计数排序,桶排序,可惜我只会冒泡排序,呵呵,不过希望能够硬着头皮学习一下。算法还包括空间复杂度,时间复杂度,稳定性等等。

可视化方案也有多种,matplotlib的,pygame的,pyqt的,想来想去还是matplotlib最省事,不过尝试半天也很费劲,matplotlib也提供了不同的方式,先尝试着完成一种,另一种还在慢慢琢磨,并尝试着写的优雅些。

既然是写代码,当然首先得阅读代码,再次是写好点,比如封装点对象,增加标准的计算时间函数,把代码优雅的写好一点,把注释尽量写完整一些等等。

优化是个过程,得慢慢来。

代码示例

代码语言:javascript
复制
import random
import copy
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

def init_sortdata(datarage=10,datanum=10):
    data = list(range(datarage))
    data = random.sample(data, k=datanum)
    return data

#计算时间函数
def print_run_time(func):
    def wrapper(*args, **kw):
        start_time = time.time()  # 程序开始时间
        ret=func(*args, **kw)     # 将被装饰函数的返回值接收
        end_time = time.time()   # 程序结束时间
        total_time = int(1000*(end_time - start_time)) #程序执行时间,毫秒计
        print('{}排序算法共计执行{}豪秒,开始时间为{},结束时间为{}'.format(func.__name__,total_time,start_time,end_time))
        return ret                # 返回被装饰函数的返回值
    return wrapper

class SortClass:
    def __init__(self,collection):
        self.collection=collection

    def swapAndDraw(self,tempbar, x1, x2):
        #tempbar 为 <BarContainer object of X artists>
        #tempbar[x1] 为 Rectangle(xy=(9.6, 0), width=0.8, height=98, angle=0) 对象
        temp1height = tempbar[x1].get_height()              #获取待交换图像x1的高度,写入临时变量
        tempbar[x1].set_height(tempbar[x2].get_height())    #将x1的高度置为x2的高度
        tempbar[x2].set_height(temp1height)                 #将x2的高度置为x1的高度
        tempbar[x2].set_fc("red")                           #将要交换的x2置为红色标志
        plt.draw()                                          #绘制图形
        plt.pause(0.1)                                      #为体现动画,设置延迟时间为0.1秒
        tempbar[x2].set_fc("green")                         #再将要交换的x2重置为绿色标志

    @print_run_time
    def bubble_sort(self):
        #冒泡排序,数据来自类的初始化,为了不改变源list数据,采用深拷贝方式
        dataset = copy.deepcopy(self.collection)
        stepdata=[]
        length = len(dataset)   #list长度
        runtimes=0              #交换次数
        looptimes=0             #循环次数
        print('原始数据=',dataset)  #记录原始数据
        plt.figure('bubble_sort')
        plt.title('bubble_sort')
        plt.xticks(range(0,length), rotation=45)                #进行X轴设置
        tempbar = plt.bar(range(length), dataset, fc="green")   #初始化元数据
        for i in range(length - 1):
            print(' 第{}轮外轮,开始数据={}'.format(i, dataset))
            swapped = False
            for j in range(length - 1 - i):
                if dataset[j] > dataset[j + 1]:                             #相邻元素间交叉判断
                    swapped = True
                    runtimes=runtimes+1 #记录交换次数
                    dataset[j], dataset[j + 1] = dataset[j + 1], dataset[j] #数据交换
                    stepdata.append(dataset.copy())                            #
                    self.swapAndDraw(tempbar, j, j + 1)                     #绘制动画图
                looptimes=looptimes+1   #记录循环次数
                print('     第{}轮内轮,中间数据={}'.format(j, dataset))  #记录内轮中间数据
            if not swapped:
                break
            print(' 第{}轮外轮,结束数据={}'.format(i,dataset))           #记录外轮中间数据
        print('最终数据=', dataset) #记录最终数据
        plt.ioff()
        return looptimes,runtimes,dataset,stepdata

    


if __name__ == "__main__":
    import time
    orgdata=init_sortdata(100,10)
    asort=SortClass(orgdata)
    looptimes,runtime,sortdata,stepdata=asort.bubble_sort()
    print('排序前的数据为{}'.format(orgdata))
    print('排序后的数据为{}'.format(sortdata))
    print('循环次数={}'.format(looptimes))
    print('交换次数={}'.format(runtime))
    print('stepdata={}'.format(stepdata))
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python与大数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档