之前写了几个排序算法,然后看到别人将排序算法的过程可视化出来,所以就想尝试一下,然后就用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的排序算法简单可视化的更多相关文章

  1. 转载~基于比较的排序算法的最优下界为什么是O(nlogn)

    基于比较的排序算法的最优下界为什么是O(nlogn) 发表于2013/12/21 16:15:50  1024人阅读 分类: Algorithm 1.决策二叉树 回答这个问题之前我们先来玩一个猜数字的 ...

  2. 八大排序算法~简单选择排序【记录下标k变量的作用】

    八大排序算法~简单选择排序[记录下标k变量的作用] 1,思想:打擂台法,数组中的前n-1个元素依次上擂台"装嫩",后边的元素一个挨着一个不服,一个一个上去换掉它 2,优化:通过记录 ...

  3. python学习(6)选择排序算法简单代码

    选择排序的基本思想是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录.基于此思想的算法主要有简单选择排序.树型选择排序和堆排序.[1] 简单选择排序的基 ...

  4. 不基于比较的排序算法:Counting-sort和Radix-sort

  5. 【Unity3D自学记录】可视化对照十多种排序算法(C#版)

    在这篇文章中.我会向大家展示一些排序算法的可视化过程.我还写了一个工具.大家可对照查看某两种排序算法. 下载源代码 – 75.7 KB 下载演示样例 – 27.1 KB 引言 首先,我觉得是最重要的是 ...

  6. 简单排序算法设计(Java)

    总共有八种排序算法,还是慢慢看吧 1.简单排序算法 简单排序算法就是设置标兵,逐个比较数,然后查找插入位置,插入 public static void p(int[] a){ for(int i=0; ...

  7. 第32讲:List的基本操作实战与基于模式匹配的List排序算法实现

    今天来学习一下list的基本操作及基于模式匹配的排序操作 让我们从代码出发 val bigData = List("hadoop","spark") val d ...

  8. Rxjs入门实践-各种排序算法排序过程的可视化展示

    Rxjs入门实践-各种排序算法排序过程的可视化展示 这几天学习下<算法>的排序章节,具体见对排序的总结,想着做点东西,能将各种排序算法的排序过程使用Rxjs通过可视化的方式展示出来,正好练 ...

  9. JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)

    1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...

随机推荐

  1. IEEE Spectrum 2014年十大编程语言盘点

    近日,IEEE Spectrum推出 了一个最流行的编程语言排行榜.排行榜筛选了 12 项指标,综合了 10 个来源(含 IEEE Xplore.Google.GitHub)的数据,最终评选出了下面这 ...

  2. pythono整数和字符串魔法方法

    1.整数(int) a = 1 b = 2 c = 3 d = 4 e = 5u a1 = a.bit_length() b1 = b.bit_length() c1 = c.bit_length() ...

  3. less在vscode中的配置方式

    1.在vscode插件中下载easy less这个插件. 2.新建项目,分别建两个文件夹存放less和自动编译好的css,页面中引入文件引css就可以了. 3.根据你的文件位置,在用户设置中设置需要配 ...

  4. navcat工具常用快捷键

     navcat工具常用快捷键 ctrl + n: 打开新查询窗口 ctrl + shit + r: 只运行选中的语句 ctrl + /: 注释 (选中要注释的行,然后用快捷键注释) ctrl + sh ...

  5. JavaBean是什么

    作者:杨博链接:https://www.zhihu.com/question/19773379/answer/31625054来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...

  6. Linux 只复制目录,不复制目录下数据文件

    [root@yoon u02]# mkdir yoon [root@yoon u02]# mkdir hank [root@yoon yoon]# mkdir -p 1/data [root@yoon ...

  7. Linux安装C++环境

    centos 安装gcc-c++ yum install gcc-c++ 安装CMake yum install cmake 切换gcc版本 安装devtoolset-x 安装devtoolset-3 ...

  8. Dubbo的配置过程,实现原理及架构详解

    一. Dubbo是什么?Dubbo能做什么? 随着互联网的发展,市场需求快速变更,业务持续高速增长,网站早已从单一应用架构演变为分布式服务架构及流动计算架构.在分布式架构的背景下,在本地调用非本进程内 ...

  9. C++的bitset(位操作使用),转载

    有些程序要处理二进制位的有序集,每个位可能包含的是0(关)或1(开)的值.位是用来保存一组项或条件的yes/no信息(有时也称标志)的简洁方法.标准库提供了bitset类使得处理位集合更容易一些.要使 ...

  10. mysql合并结果集