之前写了几个排序算法,然后看到别人将排序算法的过程可视化出来,所以就想尝试一下,然后就用Qt简单写了个界面,用QImage和QPainter来画图显示,代码比较简单。

我的想法是画图的时候,图像的X轴对应数组的,然后画垂直线,线的高度就是数组元素值的大小。首先需要一个画整个数组的函数,这个函数要将数组整个画到图像上,背景取黑色,然后线取绿色,为了可视化,将图像的大小设置为宽度数组的元素个数乘以10加10,高度为数组元素最大值乘以10加50,线的宽度为8,这些值都是可以调整的,然后每条线之间要有一定间隔,不然都混在一起了:

  1. void QtSort::drawArray2QImg(int low, int high)
  2. {
  3. if (NULL == m_pNum || NULL == m_pSortImg)
  4. {
  5. return;
  6. }
  7. m_pSortImg->fill(Qt::black);
  8. QPainter painter(this);
  9. QPen pen;
  10. pen.setColor(Qt::green);
  11. pen.setWidth(dWidth);
  12. QFont font;
  13. font.setPointSize(10);
  14. font.setBold(true);
  15. painter.begin(m_pSortImg);
  16. painter.setPen(pen);
  17. painter.setFont(font);
  18. for (int i = low; i < high; i++)
  19. {
  20.     pen.setColor(Qt::green);
  21.     painter.setPen(pen);
  22.     QPoint pnt1 = QPoint(* dMul + dWidth / 2 + 4, dLen * dMul + 50);
  23.     QPoint pnt2 = QPoint(* dMul + dWidth / 2 + 4, dLen * dMul + 50 - m_pNum[i] * dMul + 5);
  24.     painter.drawLine(pnt1, pnt2);
  25. }
  26. for (int i = low; i < high; i++)
  27. {
  28.     int index = (m_pNum[i] < 10 ? 0 : 1);
  29.     QPoint pnt3 = QPoint(* dMul + dWidth / 2 - 2 * index, dLen * dMul + 50 - m_pNum[i] * dMul - 5);
  30.     pen.setColor(Qt::red);
  31.     painter.setPen(pen);
  32.     painter.drawText(pnt3, QString::number(m_pNum[i]));
  33. }
  34. painter.end();
  35. m_pNumQLabel->setPixmap(QPixmap::fromImage(*m_pSortImg));
  36. m_pNumQLabel->setFixedSize(m_pSortImg->width(), m_pSortImg->height());
  37. this->resize(m_pSortImg->width() * 2 + 100, m_pSortImg->height() + 50);
  38. QApplication::processEvents();
  39. QTime dieTime = QTime::currentTime().addMSecs(m_dTime);
  40. while (QTime::currentTime() < dieTime)
  41. {
  42.     QApplication::processEvents();
  43. }
  44. }

除了要画出整个数组之外,还要把排序过程中哪些变化的item标注出来,所以要对变化的元素单独画一遍:

  1. void QtSort::drawArray2QImg(int index, Qt::GlobalColor color1, Qt::GlobalColor color2)
  2. {
  3. if (NULL == m_pNum || NULL == m_pSortImg)
  4. {
  5.     return;
  6. }
  7. //m_pSortImg->fill(Qt::black);
  8. QPainter painter(this);
  9. QPen pen;
  10. pen.setColor(color1);
  11. pen.setWidth(dWidth);
  12. QFont font;
  13. font.setPointSize(10);
  14. font.setBold(true);
  15. painter.begin(m_pSortImg);
  16. painter.setPen(pen);
  17. painter.setFont(font);
  18. pen.setColor(color1);
  19. painter.setPen(pen);
  20. QPoint pnt1 = QPoint(index * dMul + dWidth / 2 + 4, dLen * dMul + 50);
  21. QPoint pnt2 = QPoint(index * dMul + dWidth / 2 + 4, dLen * dMul + 50 - m_pNum[index] * dMul + 5);
  22. painter.drawLine(pnt1, pnt2);
  23. int dIndex = (m_pNum[index]  < 10 ? 0 : 1);
  24. QPoint pnt3 = QPoint(index * dMul + dWidth / 2 - 2 * dIndex, dLen * dMul + 50 - m_pNum[index] * dMul - 5);
  25. pen.setColor(color2);
  26. painter.setPen(pen);
  27. painter.drawText(pnt3, QString::number(m_pNum[index]));
  28. painter.end();
  29. m_pNumQLabel->setPixmap(QPixmap::fromImage(*m_pSortImg));
  30. m_pNumQLabel->setFixedSize(m_pSortImg->width(), m_pSortImg->height());
  31. this->resize(m_pSortImg->width() * 2 + 100, m_pSortImg->height() + 50);
  32. QApplication::processEvents();
  33. QTime dieTime = QTime::currentTime().addMSecs(m_dTime);
  34. while (QTime::currentTime() < dieTime)
  35. {
  36. QApplication::processEvents();
  37. }
  38. }

由于是今天刚写的,代码上还需要优化的,不过基本的效果都出来了,倒也不错哈。现在展示下结果吧:

冒泡:

选择:

插入:

希尔:

归并:

快速:

只是简单的展示下而已,不过还是挺好玩的。

山光物态弄春辉,

莫为轻阴便拟归。 

纵使晴明无雨色,

入云深处亦沾衣。

基于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. 39数组中只出现一次的数字+判断的时候一定加上括号,&的优先级低于!=

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.     思路:记住位运算的基本操作,与或非,异或,异或是两个数相同则为0,不同为1,理解为加法运 ...

  2. 《Netlogo多主体建模入门》笔记4

    4- 从Langton的蚂蚁看Turtle与Patch的交互   这只蚂蚁从10000步开始,就会自发地 “建桥”     Turtle与Patch就好比是,一个方块和一个格子的关系. 一个格子上可以 ...

  3. 替换django的user模型出现的异常django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency users.0001_initial on database 'default'

    django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applie ...

  4. ROS-3 : Catkin工作空间和ROS功能包

    一.创建一个Catkin工作空间 步骤一:构建catkin工作空间 安装完成ROS版本后,设置好环境变量:$ source /opt/ros/kinetic/setup.bash.然后即可创建一个ca ...

  5. 十八 JQuery&Ajax&Json&Xstream

    JQuery 1 是什么?有什么用? JavaScript的代码类库 简化代码,提高效率.write less do more 1 JQuery与Servlet数据交互,load方式(少用) 语法:$ ...

  6. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:内嵌下拉菜单的按钮组

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. arm linux 移植 OpenCV

    背景: 由于学习了摄像头有关的开发,顺理成章地接触了这个部分. 搭建环境 openCV 2.2以后版本需要使用Cmake生成makefile文件,因此需要先安装cmake. OpenCV : v4.2

  8. 51nod 1433:0和5

    1433 0和5 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  取消关注 小K手中有n张牌,每张牌上有一个一位数的数, ...

  9. WEB-INF

    WEB-INF下的内容是没有办法通过浏览器去请求的.可以把东西放在WEB-INF下面,避免用户直接通过浏览器请求.那些资源只允许通过url请求过来通过其他途径转发给用户. 比如WEB-INF/jsp/ ...

  10. Day4 - D - Watchcow POJ - 2230

    Bessie's been appointed the new watch-cow for the farm. Every night, it's her job to walk across the ...