基于Qt5的排序算法简单可视化
之前写了几个排序算法,然后看到别人将排序算法的过程可视化出来,所以就想尝试一下,然后就用Qt简单写了个界面,用QImage和QPainter来画图显示,代码比较简单。
我的想法是画图的时候,图像的X轴对应数组的,然后画垂直线,线的高度就是数组元素值的大小。首先需要一个画整个数组的函数,这个函数要将数组整个画到图像上,背景取黑色,然后线取绿色,为了可视化,将图像的大小设置为宽度数组的元素个数乘以10加10,高度为数组元素最大值乘以10加50,线的宽度为8,这些值都是可以调整的,然后每条线之间要有一定间隔,不然都混在一起了:
void QtSort::drawArray2QImg(int low, int high)
{
if (NULL == m_pNum || NULL == m_pSortImg)
{
return;
}
m_pSortImg->fill(Qt::black);
QPainter painter(this);
QPen pen;
pen.setColor(Qt::green);
pen.setWidth(dWidth);
QFont font;
font.setPointSize(10);
font.setBold(true);
painter.begin(m_pSortImg);
painter.setPen(pen);
painter.setFont(font);
for (int i = low; i < high; i++)
{
pen.setColor(Qt::green);
painter.setPen(pen);
QPoint pnt1 = QPoint(i * dMul + dWidth / 2 + 4, dLen * dMul + 50);
QPoint pnt2 = QPoint(i * dMul + dWidth / 2 + 4, dLen * dMul + 50 - m_pNum[i] * dMul + 5);
painter.drawLine(pnt1, pnt2);
}
for (int i = low; i < high; i++)
{
int index = (m_pNum[i] < 10 ? 0 : 1);
QPoint pnt3 = QPoint(i * dMul + dWidth / 2 - 2 * index, dLen * dMul + 50 - m_pNum[i] * dMul - 5);
pen.setColor(Qt::red);
painter.setPen(pen);
painter.drawText(pnt3, QString::number(m_pNum[i]));
}
painter.end();
m_pNumQLabel->setPixmap(QPixmap::fromImage(*m_pSortImg));
m_pNumQLabel->setFixedSize(m_pSortImg->width(), m_pSortImg->height());
this->resize(m_pSortImg->width() * 2 + 100, m_pSortImg->height() + 50);
QApplication::processEvents();
QTime dieTime = QTime::currentTime().addMSecs(m_dTime);
while (QTime::currentTime() < dieTime)
{
QApplication::processEvents();
}
}
除了要画出整个数组之外,还要把排序过程中哪些变化的item标注出来,所以要对变化的元素单独画一遍:
void QtSort::drawArray2QImg(int index, Qt::GlobalColor color1, Qt::GlobalColor color2)
{
if (NULL == m_pNum || NULL == m_pSortImg)
{
return;
}
//m_pSortImg->fill(Qt::black);
QPainter painter(this);
QPen pen;
pen.setColor(color1);
pen.setWidth(dWidth);
QFont font;
font.setPointSize(10);
font.setBold(true);
painter.begin(m_pSortImg);
painter.setPen(pen);
painter.setFont(font);
pen.setColor(color1);
painter.setPen(pen);
QPoint pnt1 = QPoint(index * dMul + dWidth / 2 + 4, dLen * dMul + 50);
QPoint pnt2 = QPoint(index * dMul + dWidth / 2 + 4, dLen * dMul + 50 - m_pNum[index] * dMul + 5);
painter.drawLine(pnt1, pnt2);
int dIndex = (m_pNum[index] < 10 ? 0 : 1);
QPoint pnt3 = QPoint(index * dMul + dWidth / 2 - 2 * dIndex, dLen * dMul + 50 - m_pNum[index] * dMul - 5);
pen.setColor(color2);
painter.setPen(pen);
painter.drawText(pnt3, QString::number(m_pNum[index]));
painter.end();
m_pNumQLabel->setPixmap(QPixmap::fromImage(*m_pSortImg));
m_pNumQLabel->setFixedSize(m_pSortImg->width(), m_pSortImg->height());
this->resize(m_pSortImg->width() * 2 + 100, m_pSortImg->height() + 50);
QApplication::processEvents();
QTime dieTime = QTime::currentTime().addMSecs(m_dTime);
while (QTime::currentTime() < dieTime)
{
QApplication::processEvents();
}
}
由于是今天刚写的,代码上还需要优化的,不过基本的效果都出来了,倒也不错哈。现在展示下结果吧:
冒泡:
选择:
插入:
希尔:
归并:
快速:
只是简单的展示下而已,不过还是挺好玩的。
山光物态弄春辉,
莫为轻阴便拟归。
纵使晴明无雨色,
入云深处亦沾衣。
基于Qt5的排序算法简单可视化的更多相关文章
- 转载~基于比较的排序算法的最优下界为什么是O(nlogn)
基于比较的排序算法的最优下界为什么是O(nlogn) 发表于2013/12/21 16:15:50 1024人阅读 分类: Algorithm 1.决策二叉树 回答这个问题之前我们先来玩一个猜数字的 ...
- 八大排序算法~简单选择排序【记录下标k变量的作用】
八大排序算法~简单选择排序[记录下标k变量的作用] 1,思想:打擂台法,数组中的前n-1个元素依次上擂台"装嫩",后边的元素一个挨着一个不服,一个一个上去换掉它 2,优化:通过记录 ...
- python学习(6)选择排序算法简单代码
选择排序的基本思想是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录.基于此思想的算法主要有简单选择排序.树型选择排序和堆排序.[1] 简单选择排序的基 ...
- 不基于比较的排序算法:Counting-sort和Radix-sort
- 【Unity3D自学记录】可视化对照十多种排序算法(C#版)
在这篇文章中.我会向大家展示一些排序算法的可视化过程.我还写了一个工具.大家可对照查看某两种排序算法. 下载源代码 – 75.7 KB 下载演示样例 – 27.1 KB 引言 首先,我觉得是最重要的是 ...
- 简单排序算法设计(Java)
总共有八种排序算法,还是慢慢看吧 1.简单排序算法 简单排序算法就是设置标兵,逐个比较数,然后查找插入位置,插入 public static void p(int[] a){ for(int i=0; ...
- 第32讲:List的基本操作实战与基于模式匹配的List排序算法实现
今天来学习一下list的基本操作及基于模式匹配的排序操作 让我们从代码出发 val bigData = List("hadoop","spark") val d ...
- Rxjs入门实践-各种排序算法排序过程的可视化展示
Rxjs入门实践-各种排序算法排序过程的可视化展示 这几天学习下<算法>的排序章节,具体见对排序的总结,想着做点东西,能将各种排序算法的排序过程使用Rxjs通过可视化的方式展示出来,正好练 ...
- JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)
1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...
随机推荐
- 5.6 Nginx Rewrite模块配置
- java文件相关(文件追加内容、文件内容清空、文件内容读取)
https://blog.csdn.net/xnz0616/article/details/39137177 1.文件内容追加 // 在已有的文件后面追加信息 public static void a ...
- pip 安装源
pip 安装源 介绍 1.采用国内源,加速下载模块的速度 2.常用pip源: -- 豆瓣:https://pypi.douban.com/simple -- 阿里:https://mirrors.al ...
- ESX/ESXi 主机上的每个插槽中安装了多少内存
要确定在 ESX/ESXi 主机上的每个插槽中安装了多少内存,请执行以下操作: 1. 启动ssh服务 2. 登陆esxi主机查看 使用 SSH 客户端登录主机,以 root 用户身份运行以下命令之一: ...
- Adobe Illustrator CC 2017安装方法
1.下载软件地址 2017破解版32位64位中文版下载[百度网盘资源地址]:https://pan.baidu.com/s/13BsU8CfsLB6OXr7SkRFzCg 注意:使用之前请关闭杀毒软件 ...
- JavaScript深入理解对象方法——Object.entries()
Object.entries()方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举原型链中的属性) 示例 ...
- python 输入年月日,返回当天是星期几
引入内置模块calendar,输入年.月.日,根据weekday(year,month,day)的返回值,输出该日期是星期几.函数weekday()返回0-6分别对应星期一至星期日 import ca ...
- 037、Java中利用判断语句实现三目运算的功能
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- angularJS 服务
- Django(十)模型:django模型类对数据库的:增/删/改/查、自关联、管理器、元选项(指定表名)
一.插入.更新和删除 调用一个模型类对象的save方法的时候就可以实现对模型类对应数据表的插入和更新. 调用一个模型类对象的delete方法的时候就可以实现对模型类对应数据表数据的删除. 二.自关联 ...