两句闲话

  本文所说的排序是指基于交换的排序。因此,按理来说,本文应该叫基于交换的排序的动态展示,但是这样太拗口了。

效果展示

  最终效果如下。

  

  

  

实现方法

  需要说明的是,在这里是通过pygame来实现图形界面;程序使用python 3.5编写。使用pygame的好处在于,它非常自由(当然也非常麻烦)。

  我们一共需要编写四个文件:draw.py,sort_show.py,sort.py,main.py。

1.draw.py

  在这里,我们先在draw.py中写一个Draw类,以实现pygame生成界面的基本流程。需要说明的是,这个类中有一些东西,在这里我们并不会用到。

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Tue Dec 29 10:24:50 2015
  4.  
  5. @author: super zhang
  6. """
  7.  
  8. import pygame
  9. from pygame.locals import *
  10.  
  11. class Draw:
  12. """
  13. to provide a general structure for using pygame
  14. STRUCTURE:
  15. self.mainloop()
  16. |-self.run_init()
  17. | |-self.S_pre_run_init()
  18. | |-self.S_update()
  19. |
  20. |-self.run()
  21. |-sef.S_event(event)
  22. | |-self.S_keydown_event(key)
  23. | |-self.S_keyup_event(key)
  24. | |-self.S_mousebutton_event(button)
  25. |
  26. |-self.S_mouse_move_event()
  27. |-self.S_time()
  28. |-self.S_move()
  29. |-self.S_update()
  30. |-self.S_draw()
  31. |-self.S_load_img()
  32. METHOD:
  33. self.M_screen_mode(mode,SCREEN_SIZE)
  34. self.M_draw_text(size,text,pos,text_color)
  35. self.M_mouse_pos()
  36. self.M_load_img(img_file)
  37. """
  38. def __init__(self):
  39. self.SCREEN_SIZE=(720,480)
  40. self.screen_mode=0
  41. def M_screen_mode(self,mode,SCREEN_SIZE):
  42. """usually called in __init__"""
  43. self.screen_mode=mode
  44. self.SCREEN_SIZE=SCREEN_SIZE
  45. def mainloop(self):
  46. self.run_init()
  47. while True:
  48. self.run()
  49. def run_init(self):
  50. pygame.init()
  51. self.S_pre_run_init()
  52. self.screen=pygame.display.set_mode(self.SCREEN_SIZE,self.screen_mode,32)
  53. self.S_update()
  54. def S_pre_run_init(self):
  55. pass
  56. def run(self):
  57. for event in pygame.event.get():
  58. if event.type==QUIT:
  59. pygame.quit()
  60. else:
  61. self.S_event(event)
  62. self.S_mouse_move_event()
  63. self.S_time()
  64. self.S_move()
  65. self.S_update()
  66. def S_event(self,event):
  67. if event.type==KEYDOWN:
  68. self.S_keydown_event(event.key)
  69. elif event.type==KEYUP:
  70. self.S_keyup_event(event.key)
  71. elif event.type==MOUSEBUTTONDOWN:
  72. self.S_mousebutton_event(event.button)
  73. def S_keydown_event(self,key):
  74. pass
  75. def S_keyup_event(self,key):
  76. pass
  77. def S_mousebutton_event(self,button):
  78. pass
  79. def S_mouse_move_event(self):
  80. pass
  81. def S_time(self):
  82. pass
  83. def S_move(self):
  84. pass
  85. def S_update(self):
  86. self.screen.fill((0,0,0))
  87. self.S_draw()
  88. self.S_load_img()
  89. pygame.display.update()
  90. def S_load_img(self):
  91. pass
  92. def S_draw(self):
  93. pass
  94. def M_draw_text(self,size,text,pos,text_color):
  95. #for further use
  96. cur_font=pygame.font.SysFont("宋体",size)
  97. text_fmt=cur_font.render(text,1,text_color)
  98. self.screen.blit(text_fmt,pos)
  99. def M_mouse_pos(self):
  100. return pygame.mouse.get_pos()
  101. def M_load_img(self,img_file):
  102. return pygame.image.load(img_file)
  103.  
  104. if __name__=="__main__":
  105. d=Draw()
  106. d.mainloop()

2.sort_show.py   

  下面是动态展示排序的主类,写在sort_show.py中

  1. import pygame
  2. from pygame.locals import *
  3.  
  4. from draw import Draw
  5.  
  6. class SortShow(Draw):
  7. def __init__(self,lst,lst_change):
  8. Draw.__init__(self)
  9. self.lst=lst
  10. self.lst_change=lst_change
  11. self.len=len(lst)
  12. self.max=max(lst)
  13. self.step=0
  14. self.whole_step=len(lst_change)
  15. self.time_delay=100#ms
  16. self.stop_flag=True
  17. def S_draw(self):
  18. pygame.time.delay(self.time_delay)
  19. self._change_lst()
  20. self._cal_rect()
  21. self._draw_rect()
  22. self._put_text()
  23. def _change_lst(self):
  24. if not self.stop_flag:
  25. if self.step<self.whole_step:
  26. changing=self.lst_change[self.step]
  27. i=changing[0]
  28. j=changing[1]
  29. flag=changing[2]
  30. if flag==1:
  31. self.lst[i],self.lst[j]=self.lst[j],self.lst[i]
  32. if flag==2:
  33. key=self.lst[j]
  34. del self.lst[j]
  35. self.lst[i+1:i+1]=[key]#move key
  36. self.step=self.step+1
  37. def _cal_rect(self):
  38. self.rects=[]
  39. x_div=720.0/self.len
  40. y_div=480.0/self.max/1.5
  41. for i in range(self.len):
  42. width=x_div-1
  43. height=self.lst[i]*y_div
  44. length=i*x_div
  45. top=480-height
  46. rect=[length,top,width,height]
  47. self.rects+=[rect]
  48.  
  49. changing=self.lst_change[self.step-1]
  50. p1=changing[0]
  51. p2=changing[1]
  52. for i in [p1,p2]:
  53. width=x_div-1
  54. height=self.lst[i]*y_div
  55. length=i*x_div
  56. top=480-height
  57. rect=[length,top,width,height]
  58. self.rects+=[rect]
  59. def _draw_rect(self):
  60. for rect in self.rects[:-2]:
  61. pygame.draw.rect(self.screen,(255,255,255),rect,0)
  62. #rect: left,top,width,height
  63.  
  64. if self.step<self.whole_step:
  65. for rect in self.rects[-2:]:
  66. pygame.draw.rect(self.screen,(0,0,255),rect,0)
  67. def _put_text(self):
  68. self.M_draw_text(20,"1.press esc to quit",(20,20),(0xff,0xff,0x0))
  69. self.M_draw_text(20,"2.press T to set delay_time",(20,40),(0xff,0xff,0x0))
  70. self.M_draw_text(20,"3.press s to start or stop",(20,60),(0xff,0xff,0x0))
  71. def S_keydown_event(self,key):
  72. if key==K_ESCAPE:
  73. exit()
  74. if key==K_t:
  75. self._set_time_delay()
  76. if key==K_s:
  77. self.stop_flag=not(self.stop_flag)
  78. def _set_time_delay(self):
  79. try:
  80. print ("-*-delay_time set-*-")
  81. time_delay=int(input("please input delay time\ndefalut vlaue is 100ms\ntime(ms):"))
  82. self.time_delay=time_delay
  83. finally:
  84. print ("-*-finish-*-")

3.sort.py

  接下来,我们在sort.py中写冒泡排序(也可以写其他排序),这里的排序要输出每次交换的两个元素的下标

  1. import random
  2.  
  3. def ge(min_value,max_value):
  4. def tmp(num):
  5. lst=[]
  6. for i in range(num):
  7. value=random.randint(min_value,max_value)
  8. lst.append(value)
  9. return lst
  10. return tmp
  11.  
  12. def bubble_sort(lst):
  13. lst1=lst[:]
  14. res=[]
  15. num=len(lst1)
  16. for i in range(num-1):#from 1 to num
  17. for j in range(num-1,i,-1):#from num-1 to i+1
  18. tmp=[j-1,j,0]
  19. if lst1[j-1]>lst1[j]:
  20. lst1[j-1],lst1[j]=lst1[j],lst1[j-1]
  21. tmp[2]=1
  22. res.append(tmp)
  23. return res
  24.  
  25. if __name__=="__main__":
  26. lst=ge(0,999)(100)
  27. changing=bubble_sort(lst)
  28. print (changing)

4.main.py

  最后在main.py中,调用sort.py和sort_show.py

  1. import sort
  2. import sort_show
  3.  
  4. lst=sort.ge(0,999)(100)
  5. changing=sort.bubble_sort(lst)
  6. s=sort_show.SortShow(lst,changing)
  7. s.mainloop()

  运行main.py就能得到文章开始的效果了。

[python] 排序的动态展示的更多相关文章

  1. Python排序算法动态图形化演示(实现代码)

     1.冒泡排序 冒泡排序是最简单也是最容易理解的排序方法,其原理就是重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是 ...

  2. Python动态展示遗传算法求解TSP旅行商问题(转载)

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/jiang425776024/articl ...

  3. python排序算法之一:冒泡排序(及其优化)

    相信冒泡排序已经被大家所熟知,今天看了一篇文章,大致是说在面试时end在了冒泡排序上,主要原因是不能给出冒泡排序的优化. 所以,今天就写一下python的冒泡排序算法,以及给出一个相应的优化.OK,前 ...

  4. python基础实践 -python是一门动态解释性的强类型定义语言

    python是一门动态解释性的强类型定义语言 Python能做什么? Python是一门综合性的语言,你几乎能在计算机上通过Python做任何事情,以下是Python应该最广泛的几个方面: 1.网络应 ...

  5. 利用 Flask 动态展示 Pyecharts 图表数据的几种方法

    本文将介绍如何在 web 框架 Flask 中使用可视化工具 pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法,不会的话你来找我呀- Flask 模板渲染 1. 新建一个项目fla ...

  6. Python排序函数用法

    Python排序函数完美体现了Python语言的简洁性,对于List对象,我们可以直接调用sort()函数(这里称为"方法"更合适)来进行排序,而对于其他可迭代对象(如set,di ...

  7. python排序之二冒泡排序法

    python排序之二冒泡排序法 如果你理解之前的插入排序法那冒泡排序法就很容易理解,冒泡排序是两个两个以向后位移的方式比较大小在互换的过程好了不多了先上代码吧如下: 首先还是一个无序列表lis,老规矩 ...

  8. python排序之一插入排序

    python排序之一插入排序 首先什么是插入排序,个人理解就是拿队列中的一个元素与其之前的元素一一做比较交根据大小换位置的过程好了我们先来看看代码 首先就是一个无序的列表先打印它好让排序后有对比效果, ...

  9. 用 Python 排序数据的多种方法

    用 Python 排序数据的多种方法 目录 [Python HOWTOs系列]排序 Python 列表有内置就地排序的方法 list.sort(),此外还有一个内置的 sorted() 函数将一个可迭 ...

随机推荐

  1. 103. Binary Tree Zigzag Level Order Traversal -----层序遍历

      Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left ...

  2. Github 的其他用法

    一.概述 Github 除了作为代码托管库外,有趣的程序员们还利用它解锁了有趣的新姿势. 二.新姿势 2.1 Github Pages 可以为项目建立静态主页(即gh-pages分支), 也可以建立命 ...

  3. VMWare 网络连接模式(bridged、NAT、host-only)详解

    转自VMWare 网络连接模式(bridged.NAT.host-only)详解 host-only 在某些特殊的网络调试环境中,如何要求将真实环境和虚拟环境隔离开,这时你就可采用host-only模 ...

  4. C# 异步同步调用

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: /*添加的命名空间 u ...

  5. 源码编译配置lnmp部署zabbix

    环境说明: [root@wcy ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@wcy ~]# uname -a Linux ...

  6. 【I/O】常见输入输出

    缓冲输入文件.输出文件 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; ...

  7. ES6 实现阶乘

    // 实现一个5的阶乘function factorial(n, acc = 1) { console.log(`n=${n};acc=${acc}`) if(n <= 1) return ac ...

  8. jvm-内存区域与内存溢出异常

    内存区域与内存溢出异常 参考: http://www.cnblogs.com/ityouknow/p/5610232.html 所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢? ...

  9. SFTP无法连接 Connection closed by server with exitcode 127

    命令: Pass: ************状态: Connected to 66.77.88.99错误: Connection closed by server with exitcode 127错 ...

  10. Redis 后台运行

    编辑配置文件 vim {redis_home}/redis.conf 修改daemonize  (默认为no,修改为yes) 启动redis{redis_home}/src/redis-server ...