排序过程的图形模拟
几个月前aa55发了一个视频模拟排序,效果很不错,我现在也在学算法这些东西,少不了要搞这个,今天一试才发现冒泡排序都不会写了,错了3次才写对。那么如何实现动画展示排序过程呢?下面是效果和MFC源码。MFC虽然很多“高手”都不屑于用,不过如果真正懂的话,是可以写写出很好的东西的,工具总是次要的。关键代码:
CDialog::OnPaint();
if(toDraw.empty())
return;
DrawData& curdata=toDraw.front();
RECT drawrt;
m_draw.GetClientRect(&drawrt);
CClientDC dc(&m_draw);
CDC MemDC;
CBitmap MemBitmap;
MemDC.CreateCompatibleDC(&dc);
MemBitmap.CreateCompatibleBitmap(&dc,drawrt.right,drawrt.bottom);
MemDC.SelectObject(&MemBitmap);
CBrush clearbrush(RGB(255,255,255));
MemDC.FillRect(&drawrt,&clearbrush);
CBrush normal(RGB(0,0,255)),stress(RGB(255,0,0));
int size=curdata.data.size();
for(int i=0;i<size;i++)
{
int num=curdata.data.at(i);
if(curdata.stress.count(i))
{
MemDC.SelectObject(&stress);
curdata.stress.erase(num);
}
else
{
MemDC.SelectObject(&normal);
}
MemDC.Rectangle(i*BARSIZE,drawrt.bottom-num,i*BARSIZE+BARSIZE,drawrt.bottom);
}
dc.BitBlt(0,0,drawrt.right,drawrt.bottom,&MemDC,0,0,SRCCOPY);
if(toDraw.size() > 1)
toDraw.pop();
MemDC.DeleteDC();
MemBitmap.DeleteObject();
。。。
data.clear();
RECT drawrect;
m_draw.GetClientRect(&drawrect);
for(int i=0;i<drawrect.right/BARSIZE;i++)
{
data.push_back(rand()%drawrect.bottom);
TRACE("%d ",data.back());
}
TRACE("\n");
toDraw.push(DrawData(data,set<int>()));
switch(m_typelist.GetCurSel())
{
case TYPE_MAOPAO:
MAOPAO();
break;
default:
break;
}
。。。。
void CDrawsortDlg::MAOPAO()
{
int size=data.size();
for(int i=size-1;i > 0;i--)
{
for(int j=0;j < i;j++)
{
set<int> curset;
curset.insert(size-j-1);
curset.insert(size-j-2);
toDraw.push(DrawData(data,curset));
if(data < data)
{
int tmp=data;
data=data;
data=tmp;
}
}
}
toDraw.push(DrawData(data,set<int>()));
}
。。。。
#include <vector>
#include <queue>
#include <set>
using namespace std;
class DrawData
{
public:
vector<int> data;//当前数组
set<int> stress;//提示要进行操作的数
DrawData(vector<int>& _data,set<int>& _stress):data(_data),stress(_stress)
{
}
};
class CDrawsortDlg : public CDialog
{
// Construction
public:
CDrawsortDlg(CWnd* pParent = NULL); // standard constructor
vector<int> data;
queue<DrawData> toDraw;
enum {BARSIZE=10,TYPE_MAOPAO=0};
void MAOPAO();
工程:
后面还会陆陆续续加算法,今天一个冒泡就把我搞晕了 高手打了双引号。意味深长
页:
[1]