ITPub博客

首页 > 数据库 > > 关于python排序算法可视化一

关于python排序算法可视化一

作者:bq_wang 时间:2020-02-19 09:47:40 0 删除 编辑

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

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

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

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

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


代码示例

  1. import random

  2. import copy

  3. import numpy as np

  4. import matplotlib.pyplot as plt

  5. from matplotlib.animation import FuncAnimation


  6. def init_sortdata(datarage=10,datanum=10):

  7. data = list(range(datarage))

  8. data = random.sample(data, k=datanum)

  9. return data


  10. #计算时间函数

  11. def print_run_time(func):

  12. def wrapper(*args, **kw):

  13. start_time = time.time() # 程序开始时间

  14. ret=func(*args, **kw) # 将被装饰函数的返回值接收

  15. end_time = time.time() # 程序结束时间

  16. total_time = int(1000*(end_time - start_time)) #程序执行时间,毫秒计

  17. print('{}排序算法共计执行{}豪秒,开始时间为{},结束时间为{}'.format(func.__name__,total_time,start_time,end_time))

  18. return ret # 返回被装饰函数的返回值

  19. return wrapper


  20. class SortClass:

  21. def __init__(self,collection):

  22. self.collection=collection


  23. def swapAndDraw(self,tempbar, x1, x2):

  24. #tempbar 为 <BarContainer object of X artists>

  25. #tempbar[x1] 为 Rectangle(xy=(9.6, ), width=0.8, height=98, angle=) 对象

  26. temp1height = tempbar[x1].get_height() #获取待交换图像x1的高度,写入临时变量

  27. tempbar[x1].set_height(tempbar[x2].get_height()) #将x1的高度置为x2的高度

  28. tempbar[x2].set_height(temp1height) #将x2的高度置为x1的高度

  29. tempbar[x2].set_fc("red") #将要交换的x2置为红色标志

  30. plt.draw() #绘制图形

  31. plt.pause(0.1) #为体现动画,设置延迟时间为0.1秒

  32. tempbar[x2].set_fc("green") #再将要交换的x2重置为绿色标志


  33. @print_run_time

  34. def bubble_sort(self):

  35. #冒泡排序,数据来自类的初始化,为了不改变源list数据,采用深拷贝方式

  36. dataset = copy.deepcopy(self.collection)

  37. stepdata=[]

  38. length = len(dataset) #list长度

  39. runtimes= #交换次数

  40. looptimes= #循环次数

  41. print('原始数据=',dataset) #记录原始数据

  42. plt.figure('bubble_sort')

  43. plt.title('bubble_sort')

  44. plt.xticks(range(,length), rotation=45) #进行X轴设置

  45. tempbar = plt.bar(range(length), dataset, fc="green") #初始化元数据

  46. for i in range(length - 1):

  47. print(' 第{}轮外轮,开始数据={}'.format(i, dataset))

  48. swapped = False

  49. for j in range(length - 1 - i):

  50. if dataset[j] > dataset[j + 1]: #相邻元素间交叉判断

  51. swapped = True

  52. runtimes=runtimes+1 #记录交换次数

  53. dataset[j], dataset[j + 1] = dataset[j + 1], dataset[j] #数据交换

  54. stepdata.append(dataset.copy()) #

  55. self.swapAndDraw(tempbar, j, j + 1) #绘制动画图

  56. looptimes=looptimes+1 #记录循环次数

  57. print(' 第{}轮内轮,中间数据={}'.format(j, dataset)) #记录内轮中间数据

  58. if not swapped:

  59. break

  60. print(' 第{}轮外轮,结束数据={}'.format(i,dataset)) #记录外轮中间数据

  61. print('最终数据=', dataset) #记录最终数据

  62. plt.ioff()

  63. return looptimes,runtimes,dataset,stepdata



  64. if __name__ == "__main__":

  65. import time

  66. orgdata=init_sortdata(100,10)

  67. asort=SortClass(orgdata)

  68. looptimes,runtime,sortdata,stepdata=asort.bubble_sort()

  69. print('排序前的数据为{}'.format(orgdata))

  70. print('排序后的数据为{}'.format(sortdata))

  71. print('循环次数={}'.format(looptimes))

  72. print('交换次数={}'.format(runtime))

  73. print('stepdata={}'.format(stepdata))




来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/6517/viewspace-3135770/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-12-07

  • 博文量
    445
  • 访问量
    1209376