之前写了几个排序算法,然后看到别人将排序算法的过程可视化出来,所以就想尝试一下,然后就用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. P1481 魔族密码(LIS变形)

    题目描述(题目链接:https://www.luogu.org/problem/P1481) 风之子刚走进他的考场,就…… 花花:当当当当~~偶是魅力女皇——花花!!^^(华丽出场,礼炮,鲜花) 风之 ...

  2. 「PA2014」Kuglarz

    传送门 memset0好评 解题思路 其实这是一道图论题 不难发现,如果知道了 \(\sum1...i\) 和 \(\sum1...j\) 的奇偶性,那么就可以得知 \(\sum i+1...j\) ...

  3. ajax请求QQ音乐

    搜索歌曲 function go() {                var val = document.getElementById("name").value;       ...

  4. texlive 安装

    texlive 可以从下面两个网址下载 https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/Images/ https://mirror ...

  5. LeetCode242 有效的字母异位词(Java字符数组排序&自定义排序记录)

    题目: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词.   示例 1: 输入: s = "anagram", t = "nagaram& ...

  6. activity带参跳转和界面登录

    首先 首先是MainActivity的xml文件 <?xml version="1.0" encoding="utf-8"?> <Linear ...

  7. POJ 3259:Wormholes bellman_ford判定负环

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 37906   Accepted: 13954 Descr ...

  8. 编程题目: 找出最小的k个数

    找出最小或者最大的几个数我使用的是堆排序,效率为0(nlgn) 构建小顶堆返回末尾的k个数 或者 构建大顶堆返回前k个数 #!/usr/bin/env python3 def heap_sort(ar ...

  9. ROS学习笔记2-基本概念

    本笔记来源于:http://wiki.ros.org/ROS/Concepts ROS文件系统级别文件系统级别主要包含了你能在ROS的磁盘上遇到的资源,包括: 包(Packages):包是ROS中资源 ...

  10. stm32CubeMx CAN 发送数据

    平台  STM32F429 软件  STM32CubeMx 5.0.0 固件库  STM32Cube_FW_F4_V1.23.0 目的: 实现 CAN 的发送 一  简介 CAN是控制器局域网络(Co ...