[python] 排序的动态展示

时间:2022-10-15 14:20:14

两句闲话

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

效果展示

  最终效果如下。

  [python] 排序的动态展示

  [python] 排序的动态展示

  [python] 排序的动态展示

实现方法

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

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

1.draw.py

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

# -*- coding: utf-8 -*-
"""
Created on Tue Dec 29 10:24:50 2015 @author: super zhang
""" import pygame
from pygame.locals import * class Draw:
"""
to provide a general structure for using pygame
STRUCTURE:
self.mainloop()
|-self.run_init()
| |-self.S_pre_run_init()
| |-self.S_update()
|
|-self.run()
|-sef.S_event(event)
| |-self.S_keydown_event(key)
| |-self.S_keyup_event(key)
| |-self.S_mousebutton_event(button)
|
|-self.S_mouse_move_event()
|-self.S_time()
|-self.S_move()
|-self.S_update()
|-self.S_draw()
|-self.S_load_img()
METHOD:
self.M_screen_mode(mode,SCREEN_SIZE)
self.M_draw_text(size,text,pos,text_color)
self.M_mouse_pos()
self.M_load_img(img_file)
"""
def __init__(self):
self.SCREEN_SIZE=(720,480)
self.screen_mode=0
def M_screen_mode(self,mode,SCREEN_SIZE):
"""usually called in __init__"""
self.screen_mode=mode
self.SCREEN_SIZE=SCREEN_SIZE
def mainloop(self):
self.run_init()
while True:
self.run()
def run_init(self):
pygame.init()
self.S_pre_run_init()
self.screen=pygame.display.set_mode(self.SCREEN_SIZE,self.screen_mode,32)
self.S_update()
def S_pre_run_init(self):
pass
def run(self):
for event in pygame.event.get():
if event.type==QUIT:
pygame.quit()
else:
self.S_event(event)
self.S_mouse_move_event()
self.S_time()
self.S_move()
self.S_update()
def S_event(self,event):
if event.type==KEYDOWN:
self.S_keydown_event(event.key)
elif event.type==KEYUP:
self.S_keyup_event(event.key)
elif event.type==MOUSEBUTTONDOWN:
self.S_mousebutton_event(event.button)
def S_keydown_event(self,key):
pass
def S_keyup_event(self,key):
pass
def S_mousebutton_event(self,button):
pass
def S_mouse_move_event(self):
pass
def S_time(self):
pass
def S_move(self):
pass
def S_update(self):
self.screen.fill((0,0,0))
self.S_draw()
self.S_load_img()
pygame.display.update()
def S_load_img(self):
pass
def S_draw(self):
pass
def M_draw_text(self,size,text,pos,text_color):
#for further use
cur_font=pygame.font.SysFont("宋体",size)
text_fmt=cur_font.render(text,1,text_color)
self.screen.blit(text_fmt,pos)
def M_mouse_pos(self):
return pygame.mouse.get_pos()
def M_load_img(self,img_file):
return pygame.image.load(img_file) if __name__=="__main__":
d=Draw()
d.mainloop()

2.sort_show.py   

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

import pygame
from pygame.locals import * from draw import Draw class SortShow(Draw):
def __init__(self,lst,lst_change):
Draw.__init__(self)
self.lst=lst
self.lst_change=lst_change
self.len=len(lst)
self.max=max(lst)
self.step=0
self.whole_step=len(lst_change)
self.time_delay=100#ms
self.stop_flag=True
def S_draw(self):
pygame.time.delay(self.time_delay)
self._change_lst()
self._cal_rect()
self._draw_rect()
self._put_text()
def _change_lst(self):
if not self.stop_flag:
if self.step<self.whole_step:
changing=self.lst_change[self.step]
i=changing[0]
j=changing[1]
flag=changing[2]
if flag==1:
self.lst[i],self.lst[j]=self.lst[j],self.lst[i]
if flag==2:
key=self.lst[j]
del self.lst[j]
self.lst[i+1:i+1]=[key]#move key
self.step=self.step+1
def _cal_rect(self):
self.rects=[]
x_div=720.0/self.len
y_div=480.0/self.max/1.5
for i in range(self.len):
width=x_div-1
height=self.lst[i]*y_div
length=i*x_div
top=480-height
rect=[length,top,width,height]
self.rects+=[rect] changing=self.lst_change[self.step-1]
p1=changing[0]
p2=changing[1]
for i in [p1,p2]:
width=x_div-1
height=self.lst[i]*y_div
length=i*x_div
top=480-height
rect=[length,top,width,height]
self.rects+=[rect]
def _draw_rect(self):
for rect in self.rects[:-2]:
pygame.draw.rect(self.screen,(255,255,255),rect,0)
#rect: left,top,width,height if self.step<self.whole_step:
for rect in self.rects[-2:]:
pygame.draw.rect(self.screen,(0,0,255),rect,0)
def _put_text(self):
self.M_draw_text(20,"1.press esc to quit",(20,20),(0xff,0xff,0x0))
self.M_draw_text(20,"2.press T to set delay_time",(20,40),(0xff,0xff,0x0))
self.M_draw_text(20,"3.press s to start or stop",(20,60),(0xff,0xff,0x0))
def S_keydown_event(self,key):
if key==K_ESCAPE:
exit()
if key==K_t:
self._set_time_delay()
if key==K_s:
self.stop_flag=not(self.stop_flag)
def _set_time_delay(self):
try:
print ("-*-delay_time set-*-")
time_delay=int(input("please input delay time\ndefalut vlaue is 100ms\ntime(ms):"))
self.time_delay=time_delay
finally:
print ("-*-finish-*-")

3.sort.py

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

import random

def ge(min_value,max_value):
def tmp(num):
lst=[]
for i in range(num):
value=random.randint(min_value,max_value)
lst.append(value)
return lst
return tmp def bubble_sort(lst):
lst1=lst[:]
res=[]
num=len(lst1)
for i in range(num-1):#from 1 to num
for j in range(num-1,i,-1):#from num-1 to i+1
tmp=[j-1,j,0]
if lst1[j-1]>lst1[j]:
lst1[j-1],lst1[j]=lst1[j],lst1[j-1]
tmp[2]=1
res.append(tmp)
return res if __name__=="__main__":
lst=ge(0,999)(100)
changing=bubble_sort(lst)
print (changing)

4.main.py

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

import sort
import sort_show lst=sort.ge(0,999)(100)
changing=sort.bubble_sort(lst)
s=sort_show.SortShow(lst,changing)
s.mainloop()

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

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

  1. Python排序算法动态图形化演示&lpar;实现代码&rpar;

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

  2. Python动态展示遗传算法求解TSP旅行商问题&lpar;转载&rpar;

    版权声明:本文为博主原创文章,遵循 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. TCP &amp&semi; UDP &amp&semi; IP

    TCP和UDP的区别   TCP UDP 是否连接 面向连接 面向非连接 应用场合 可靠的 不可靠的 速度 慢 快 传送数据 字节流 数据报 是否可用于广播 否 是 为什么UDP比TCP快 不需要连接 ...

  2. 使用HTTP协下载文件

    通过发送HTTP请求,下载文件 头文件: #ifndef __HTTP__ #define __HTTP__ #include <stdio.h> #include <stdlib. ...

  3. linux系统中如何进入退出vim编辑器,方法及区别

    在linux家族中,vim编辑器是系统自带的文本编辑器,其功能强大自不必说了.偶有小白,刚接触linux,要修改某个文本文件,不可能像WINDOWS那样操作,更有甚者,进入VI编辑器后,无法退出以致强 ...

  4. Codeforces 424 B Megacity【贪心】

    题意:给出城市(0,0),给出n个坐标,起始人数s,每个坐标k个人, 每个坐标可以覆盖到半径为r的区域,r=sqrt(x*x+y*y)的区域,问最小的半径是多少,使得城市的总人数大于等于1000000 ...

  5. Android设计模式系列--模板方法模式

    模板方法,和单例模式是我认为GOF的23中最简单的两种模式.但是我个人对模板方法的经典思想特别推崇,虽然模板方法在大对数情况下并不被推荐使用,但是这种通过父类调用子类的方法,使用继承来改变算法的一部分 ...

  6. ntp-keygen&period;c

    这个程序产生加密数据文件使用的的密码,遵循Autokey security protocol和NTPv4.文件名被名字和创建时间组成的头部当做前缀,后面跟有一个类型定义的描述符标签和PEM加密的数据结 ...

  7. java之过滤器Filter

    Java三大器之过滤器(Filter)的工作原理和代码演示   一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术之一,WEB开发人员通过Filter技术,对w ...

  8. MysqL&lowbar;SELECT FOR UPDATE详解

    先来举一个在某些应用场景下会出现数据不一致的例子,当然存储引擎是InnoDB(至于为什么,后面再告诉你). 电商平台常见的下单场景: 一般商品表(goods)有基本的四个字段,id(主键),goods ...

  9. 【NOIP2016】【CJOJ2257】2257 愤怒的小鸟

    题目 Description https://www.luogu.org/problem/show?pid=2831 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行 ...

  10. React16新特性

    React的16版本采用了MIT开源许可证,新增了一些特性. Error Boundary render方法新增返回类型 Portals 支持自定义DOM属性 setState传入null时不会再触发 ...