元始天尊 发表于 2014-7-25 01:15:53

排序过程的图形模拟

    几个月前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();


工程:

元始天尊 发表于 2014-7-25 01:16:30

后面还会陆陆续续加算法,今天一个冒泡就把我搞晕了

0xAA55 发表于 2014-7-25 08:48:40

高手打了双引号。意味深长
页: [1]
查看完整版本: 排序过程的图形模拟