tips: 形象化演示排序算法可以让初学者快速理解,比较好的例子:jun-lu的SortAnimate旧金山大学的David Galles教授的算法演示课件。最近在看canvas,试着用js+canvas自己做了一个。

实现思路

  • 获取输入字符串
  • 存入数组S[]
  • 新建一个对象数组Rect[]{ x , y , target_x , target_y , text:S[i]}(注:x , y 是当前坐标,target_x , target_y 是目的坐标,text 记录字符)
  • 排序
  • 使用插入排序进行顺序排序,当数值有交换行为时, 用track_insert[]记录进行交换的元素在数组中的位置(方便在绘制动画时进行坐标定位)
  • 因为我用的是插入排序,属于arr[i]arr[i+1]进行交换,所以只需要记录i就可以。
  • 绘制
  • 图片绘制function Draw(){}
  • 图片坐标更新function Update(){}
  • 使用setInterval()定时调用Draw()Update()函数进行页面刷新

效果

小结

做动画都是一个原理,不短刷新更新坐标,擦除,绘制,之前用opencv做的2d的小游戏也是同样的原理。

Source code

.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<link rel="stylesheet" type="text/css" href="css/demo.css"/>
<script type="text/javascript"src="js/demo2.js"></script>
<title>Demo</title>
</head>
<body>
<div id="container">
<div>
<p>Input String:
<input name="string" id="tin" type="text"/>
</p>
</div>
<div>
<p>
<input type="button" onclick="showDemo()"id="bin" value="Show"/>
</p>
<canvas id="mycanvas" ></canvas>
</div>
</div>
</body>
</html>

.js

var S;
var Coordinate_y = 40;
var Rect = new Array();
var track_insert = new Array();
var cons = 0;
var cnt; function func() {
//获取字符串,存入数组
S = document.getElementsByName("string")[0].value.split("");
//依据数组元素,完成对象数组
for (var i = 0; i < S.length; i++) {
var rect = {
x: 30 * i,
y: Coordinate_y,
target_x: 30 * i,
target_y: Coordinate_y,
text: S[i]
}
Rect.push(rect);
}
insertSort(S);
} function insertSort(arr) {
var i = 1,
j, key, temp;
for (; i < arr.length; i++) {
j = i;
key = arr[i];
while (--j >= 0) {
if (arr[j] > key) {
arr[j + 1] = arr[j];
arr[j] = key;
//当数据有交换时,记录下标
track_insert.push(j);
} else {
break;
}
}
}
}
//坐标更新
function update() {
if (cons > track_insert.length) {
return;
}
if (cons == 0) {
cnt = track_insert[cons];
Rect[cnt].target_x = Rect[cnt + 1].x;
Rect[cnt + 1].target_x = Rect[cnt].x;
cons += 1;
console.log(cnt);
}
if (Rect[cnt].x == Rect[cnt].target_x) {
if (cons == track_insert.length) {
cons += 1;
return;
}
var tem = Rect[cnt];
Rect[cnt] = Rect[cnt + 1];
Rect[cnt + 1] = tem;
cnt = track_insert[cons];
Rect[cnt].target_x = Rect[cnt + 1].x;
Rect[cnt + 1].target_x = Rect[cnt].x;
cons += 1;
console.log(cnt);
} else {
Rect[cnt].x += 1;
Rect[cnt + 1].x -= 1;
}
}
//绘制图像
function draw(context) {
context.clearRect(0, 0, context.canvas.width, context.canvas.height);
for (var i = 0; i < Rect.length; i++) {
if ((Rect[i].x - Rect[i].target_x) >= 2 || (Rect[i].x - Rect[i].target_x) < -2) {
context.fillStyle = "yellow";
context.fillRect(Rect[i].x, Rect[i].y, 25, 25);
context.fillStyle = "blue";
context.fillText(Rect[i].text, Rect[i].x + 10, Rect[i].y + 15);
} else {
context.strokeStyle = "blue";
context.strokeRect(Rect[i].x, Rect[i].y, 25, 25);
context.fillStyle = "blue";
context.fillText(Rect[i].text, Rect[i].x + 10, Rect[i].y + 15);
}
}
context.fillText("插入排序", 40, 80);
}
function showDemo() {
func();
var c = document.getElementById("mycanvas");
c.width = 600;
c.height = 300;
var context = c.getContext("2d");
//40ms调用一次函数
setInterval(function() {
draw(context);
update();
}, 40);
}

.css

input#tin{
margin-bottom: 5px;
background-color: #fff;opacity:0.85;8
width:20px;
height:25px;
border-width: 1;
font-size: 17px;
color: #000;
font-weight: 500;
border-radius: 5px;
cursor:pointer;
}
input#bin{
background-color: gray;
width:80;
height:25;
border-width: 2;
font-size: 20px;
color: #FFFFFF;
font-weight: 500;
cursor:pointer;
border-radius: 5px;
}
canvas#mycanvas{
border:1px solid;
width: 600px;
height: 300px;
margin-top: 5px;
border-radius: 5px;
}
div#container{
margin-left: 70px;
}

Canvas制作排序算法演示动画的更多相关文章

  1. 使用vue实现排序算法演示动画

    缘起 最近做的一个小需求涉及到排序,界面如下所示: 因为项目是使用vue的,所以实现方式很简单,视图部分不用管,本质上就是操作数组,代码如下: { // 上移 moveUp (i) { // 把位置i ...

  2. JS写的排序算法演示

    看到网上有老外写的,就拿起自已之前完成的jmgraph画图组件也写了一个.想了解jmgraph的请移步:https://github.com/jiamao/jmgraph 当前演示请查看:http:/ ...

  3. 用HTML5实现的各种排序算法的动画比较 及算法小结

    用HTML5实现的各种排序算法的动画比较 http://www.webhek.com/misc/comparison-sort/ 几种排序算法效率的比较 来源:http://blog.chinauni ...

  4. 链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述

    关于数据结构等的学习,以及学习算法的感想感悟,听了郝斌老师的数据结构课程,其中他也提到了学习数据结构的或者算法的一些个人见解,我觉的很好,对我的帮助也是很大,算法本就是令人头疼的问题,因为自己并没有学 ...

  5. 用HTML5实现的各种排序算法的动画比較

    用HTML5实现的各种排序算法的动画比較 非常有意思,详见: http://www.webhek.com/misc/comparison-sort/

  6. GDI+学习笔记(九)带插件的排序算法演示器(MFC中的GDI+实例)

    带插件的排序算法演示器 请尊重本人的工作成果,转载请留言.并说明转载地址,谢谢. 地址例如以下: http://blog.csdn.net/fukainankai/article/details/27 ...

  7. http://www.html5tricks.com/demo/jiaoben2255/index.html 排序算法jquery演示源代码

      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or ...

  8. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  9. 用python编写排序算法

    交换排序 === 冒泡排序,快速排序 插入排序 ===直接插入排序,希尔排序 选择排序 === 简单选择排序,堆排序 归并排序 基数排序 冒泡排序 要点 冒泡排序是一种交换排序. 什么是交换排序呢? ...

随机推荐

  1. 【转】UIKit性能调优实战讲解

    文/bestswifter(简书作者)原文链接:http://www.jianshu.com/p/619cf14640f3著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 在使用UIKi ...

  2. .net对文件的操作之对文件目录的操作

    .NET 提供一个静态File类用于文件的操作,下面列出它的主要操作方法. 返回值类型 方法名称 说明 bool Exists(string path) 用于检查指定文件是否存在 void Copy( ...

  3. C#。4 数组

    一.跳出循环的俩个关键字 1.break与continue.        这两个关键字一般放在循环的花括号里面使用.break——结束整个循环.continue——结束本次循环,进入下次循环. br ...

  4. Android-操作栏之副标题

    我们的目标是在操作栏右侧加上一个选项菜单,点击它就可显示或者隐藏操作栏的副标题. 由于操作栏是在API11级以后出现的,因此必须考虑兼容性问题.我们直接让低于API11的设备根本看不到选项菜单即可.建 ...

  5. 在eclipse中对于java的操作

    1. 新建project new project --> java project -->input the name of the project and choose the jre ...

  6. twemproxy 安装

    twemproxy 安装 1. 获取安装包 shell> wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz shell> ...

  7. jquery1.9学习笔记 之层级选择器(三)

    下一个相邻选择器(“prev + next”) 描述:选择所有给出祖先选择器的子孙选择器. 例子: <!doctype html> <html lang='zh'> <h ...

  8. C# 过滤SerialPort端口

    C#中的SerialPort类只能通过SerialPort.GetPortNames()来获取端口名字,而且出来都是COM+数字的字样,如果我要识别COM端口是什么设备的,它就无能为力了,此时我们可以 ...

  9. CSAPP--虚拟存储器

    虚拟存储器 虚拟存储器(VM)是对主存的一种抽象概念.是硬件一场,硬件地址翻译,贮存,磁盘文件和内核软件的完美交互.他为每个进程提供了一个大的,一致的和私有的地址空间. 它将贮存堪称一个存储在磁盘上的 ...

  10. log4Net使用的四个步骤

    第一步.引入程序集,并建立配置文件,放在根目录下config文件夹里.配置文件如下: <?xml version="1.0" encoding="utf-8&quo ...