基于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 数据结构与算法之美 系列用的语言是 ...
随机推荐
- OSX10.10 Yosemite安装Metasploit
安装环境 操作时间: 2015/6/8 操作系统: OSX Yosemite 10.10.3 Metasploit版本: v4.11.0-dev [core:4.11.0.pre.dev api:1. ...
- C++ 类 与 static
背景 从学习C++到使用现在,发现很多新的东西,正好整理一下. static 为静态,指是当类编译加载的时候,内存就会开辟存储空间的. static 数据成员 在类中,static 可修饰 类中的成员 ...
- Largest Beautiful Number CodeForces - 946E (贪心)
题意:给定一个长度为偶数的数,输出小于它的最大的美丽数.如果一个数长度为偶数,且没有前导零,并存在一种排列是回文数的数为美丽数.给定的t个数长度总和不超过200000. 分析: 1.存在一种排列为回文 ...
- Stm32CubeMx lwip+freeRTOS TCP 服务
如何添加lwip参照上一篇 stm32CubeMx lwip + freeRTOS 今天讲一下,如何添加TCP服务 LwIP 提供了三种编程接口,分别为 RAW/Callback API.NETC ...
- ubnutu18.4 修改交换分区大小
ubuntu18.04默认的swap文件在根目录/下,名字是swapfile 1.查看交换分区大小 也可以使用系统监视器查看 free -m 2.创建一个swap文件 :大小为8g count= 3 ...
- prepareRefresh方法源码跟踪
看这篇文章之前可以先了解之前的跟踪流程,https://www.jianshu.com/p/4934233f0ead 代码过宽,可以shift + 鼠标滚轮 左右滑动查看 AbstractApplic ...
- 我用Python帮朋友做了张猪肉数据分析图,结果。。。
却发现他是这么拿我当兄弟的 事情的经过是这样的: 我开开心心的去一家烧饼店吃饭 . 抬头一看,二师兄又涨价了 叹了口气,再这么下去真的要吃不起夹肉的烧饼了 点了两个烧饼一碗馄饨 快吃完的时候, ...
- kali linux终端快捷键设置
kali里面是没有终端快捷键的,需要自己设置. 打开设置->设备->keyboard,拉到最下面点击加号来新建一个快捷键. 名称:打开终端 命令:gnome-terminal 快捷键:Ct ...
- 原生searchView 自定义样式
https://www.jianshu.com/p/f1fe616d630d 去除搜索框中的图标 <style name="SeachViewActivityTheme" p ...
- uni-app解决小程序圆角样式不生效
在使用uni-app实现小程序的时候,设置左图的右圆角不生效,样式也都没有问题,在模拟器上也可以正常现实,手机上样式出现差别,现有以下解决方法: 设置整个圆角,然后左边使用margin-left:-3 ...