基于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();
	}
}

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

冒泡:

选择:

插入:

希尔:

归并:

快速:

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

山光物态弄春辉,

莫为轻阴便拟归。 

纵使晴明无雨色,

入云深处亦沾衣。

 

 

 

 

 

 

 

冒泡排序,顾名思义就是像水中的气泡一样逐个升上来,这就意味着它是一种交换排序。基于QT实现的冒泡排序是一种图形界面化的交互排序方式。它可以将排序结果实时显示给用户,并且可以使用户在排序过程中随时停止、继续、重置或调整速度,非常方便和人性化。下面就详细说明一下QT冒泡排序的实现。 首先,需要一个图形界面容器来实现QT的图形展示,我们可以采用QWidget或者QMainWindow,本例中采用的是QMainWindow。然后,生成一些随机数用于排序,并且在界面中展示。 接下来,可以使用一个定时器来实时监测排序的过程,并且实时更新显示,这样可以保证程序能够响应用户的操作。定时器的设置可以采用QTimer,其信号槽可以用QCoreApplication::processEvents()刺激QT处理系统事件。 在冒泡排序算法中,我们仍然需要一个外循环用于遍历所有数据,还需要一个内循环来比较相邻的两个数据并交换其位置。在UI界面中,我们对应的是一个“start”按钮来启动排序,并且可以使用一些控件如滑动条或者下拉菜单来调整排序速度等参数。 当用户点击“start”按钮后,可以采用算法的时间复杂度来校准排序的速度,具体方法可以利用定时器中的定时间隔来计算。然后开始运行排序算法,并且根据算法的执行结果实时更新图形界面中的展示,也就是动态显示排序过程。 当排序结束时,我们还可以在UI界面中添加一些交互式的控件,比如“Restart”按钮和“Stop”按钮,来让用户可以重新启动排序或者停止排序并且退出程序。 综上所述,使用QT实现冒泡排序算法是一种直观、实用,和高效的交互式排序算法。它能够让用户在排序过程中实时监测排序结果,并且方便灵活地调整排序参数。而这样的体验在CMD命令行界面下是无法实现的。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值