📄 sortview.cpp
字号:
// SortView.cpp : implementation of the CSortView class
//2005.11.12
//作者:唐火明 032124310 杨明清 032124309
#include "stdafx.h"
#include "Sort.h"
#include "SortDoc.h"
#include "SortView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include <mmsystem.h>
const int d=50;
const CPoint pt(100,360);
const CPoint ppt(100,200);
const CPoint hpt(250,80);
const CPoint hppt(750,80);
int Flag=0;
int DrawType=1;
/////////////////////////////////////////////////////////////////////////////
// CSortView
void CData::SetRect( int xLeft, int yTop, int xRight, int yBottom )
{
rt.left=xLeft;
rt.top=yTop;
rt.right=xRight;
rt.bottom=yBottom;
}
void CData::DrawFace(CDC* pDC)
{
CString str;
str.Format("%d",key);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(textcolor);
if(1==DrawType)
pDC->FillRect(&rt,&CBrush(fillcolor));
else
{
CBrush br(fillcolor);
pDC->SelectObject(&br);
pDC->Ellipse(&rt);
}
pDC->DrawText(str,&rt,DT_CENTER | DT_SINGLELINE | DT_VCENTER);
}
IMPLEMENT_DYNCREATE(CSortView, CView)
BEGIN_MESSAGE_MAP(CSortView, CView)
//{{AFX_MSG_MAP(CSortView)
ON_COMMAND(ID_INSERTIONSORT, OnInsertionsort)
ON_COMMAND(ID_BUBBLESORT, OnBubblesort)
ON_COMMAND(ID_SELECTIONSORT, OnSelectionsort)
ON_COMMAND(ID_AUTOINPUT, OnAutoinput)
ON_WM_CREATE()
ON_COMMAND(ID_QUICKSORT, OnQuicksort)
ON_COMMAND(ID_HEAPINPUT, OnHeapinput)
ON_COMMAND(ID_HEAPSORT, OnHeapsort)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSortView construction/destruction
CSortView::CSortView()
{
// TODO: add construction code here
n=10;
m_IsRun=0;
predata=new CData[n];
data=new CData[n+1];
pdata=new CData*[n+1];
AutoInput();
}
CSortView::~CSortView()
{
}
BOOL CSortView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CSortView drawing
void CSortView::OnDraw(CDC* pDC)
{
CSortDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(60,80," i =");
pDC->TextOut(160,80," j =");
Show();
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CSortView diagnostics
#ifdef _DEBUG
void CSortView::AssertValid() const
{
CView::AssertValid();
}
void CSortView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CSortDoc* CSortView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSortDoc)));
return (CSortDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CSortView message handlers
//***************************************************************************//
void CSortView::AutoInput() //-------------------自动生成排序数据
{
srand((UINT)time(NULL));
int x,y,tx,ty;
if(1==DrawType)
{
x=pt.x;y=pt.y;
tx=ppt.x;ty=ppt.y;
for(int i=1;i<=n;i++)
{
pdata[i]=&data[i];
predata[i-1].key=data[i].key=rand();
data[i].SetRect(x,y,x+d,y+d);
predata[i-1].SetRect(tx,ty,tx+d,ty+d);
x+=d+10;
tx+=d+10;
}
pdata[0]=&data[0];
data[0].key=0;
data[0].SetRect(pt.x-d-10,pt.y,pt.x-10,pt.y+d);
}
else
{
x=hpt.x;y=hpt.y;
tx=hppt.x;ty=hppt.y;
pdata[0]=&data[0];
data[0].key=0;
data[0].SetRect(0,0,d,d);
pdata[1]=&data[1];
predata[0].key=data[1].key=rand();
data[1].SetRect(x,y,x+d,y+d);
predata[0].SetRect(tx,ty,tx+d,ty+d);
x=hpt.x-120;y=hpt.y+240;
tx=hppt.x-120;ty=hppt.y+240;
for(int i=2;i<=3;i++)
{
pdata[i]=&data[i];
predata[i-1].key=data[i].key=rand();
data[i].SetRect(x,y,x+d,y+d);
predata[i-1].SetRect(tx,ty,tx+d,ty+d);
x+=240;
tx+=240;
}
x=hpt.x-180;y=hpt.y+360;
tx=hppt.x-180;ty=hppt.y+360;
for(i=4;i<=7;i++)
{
pdata[i]=&data[i];
predata[i-1].key=data[i].key=rand();
data[i].SetRect(x,y,x+d,y+d);
predata[i-1].SetRect(tx,ty,tx+d,ty+d);
x+=120;
tx+=120;
}
x=hpt.x-210;y=hpt.y+420;
tx=hppt.x-210;ty=hppt.y+420;
for(i=8;i<=n;i++)
{
pdata[i]=&data[i];
predata[i-1].key=data[i].key=rand();
data[i].SetRect(x,y,x+d,y+d);
predata[i-1].SetRect(tx,ty,tx+d,ty+d);
x+=60;
tx+=60;
}
}
for(int i=0;i<=n;i++)
{
pdata[i]->SetColor(RGB(255,0,255),RGB(0,0,255));
}
}
//***************************************************************************//
void CSortView::Show() //----------------------显示排序数据
{
CClientDC dc(this);
if(Flag)
{
dc.SetTextColor(RGB(0,0,255));
switch(Flag)
{
case 1:
dc.TextOut(400,30,"插入排序 ");
break;
case 2:
dc.TextOut(400,30,"冒泡排序 ");
break;
case 3:
dc.TextOut(400,30,"选择排序 ");
break;
case 4:
dc.TextOut(400,30,"快速排序 ");
break;
}
}
for(int i=1;i<=n;i++)
{
data[i].DrawFace(&dc);
predata[i-1].DrawFace(&dc);
}
}
//***************************************************************************//
void CSortView::Delay(DWORD dwDelayTime)//--------------------延时函数
{
DWORD dwTimeBegin,dwTimeEnd;
dwTimeBegin=timeGetTime();
do
{
dwTimeEnd=timeGetTime();
}while(dwTimeEnd-dwTimeBegin<dwDelayTime);
}
//***************************************************************************//
void CSortView::ReDraw(int i,int flag) //---------------------执行排序时的数据显示变换
{
CClientDC dc(this);
Delay(400);
pdata[i]->SetColor(RGB(255,255,255),RGB(255,255,255));
pdata[i]->DrawFace(&dc);
switch(flag)
{
case 1:
pdata[i]->rt.top-=d+10;
pdata[i]->rt.bottom-=d+10;
break;
case 2:
pdata[i]->rt.left-=d+10;
pdata[i]->rt.right-=d+10;
break;
case 3:
pdata[i]->rt.top+=d+10;
pdata[i]->rt.bottom+=d+10;
break;
case 4:
pdata[i]->rt.left+=d+10;
pdata[i]->rt.right+=d+10;
break;
}
pdata[i]->SetColor(RGB(255,0,255),RGB(0,0,255));
pdata[i]->DrawFace(&dc);
}
//***************************************************************************//
void CSortView::QuickPassShow(int i,int j,int flag) //------------快速排序的数据显示变换
{
CClientDC dc(this);
Delay(400);
switch(flag)
{
case 1:
pdata[i]->SetColor(RGB(0,255,255),RGB(0,0,255));
pdata[i]->DrawFace(&dc);
pdata[j]->SetColor(RGB(255,0,255),RGB(0,0,255));
pdata[j]->DrawFace(&dc);
break;
case 2:
pdata[i]->SetColor(RGB(255,255,255),RGB(255,255,255));
pdata[i]->DrawFace(&dc);
pdata[j]->SetColor(RGB(255,0,255),RGB(0,0,255));
pdata[j]->DrawFace(&dc);
break;
case 3:
pdata[0]->SetColor(RGB(0,255,0),RGB(0,0,255));
pdata[0]->DrawFace(&dc);
pdata[i]->SetColor(RGB(0,255,255),RGB(0,0,255));
pdata[i]->DrawFace(&dc);
pdata[j]->SetColor(RGB(0,255,255),RGB(0,0,255));
pdata[j]->DrawFace(&dc);
break;
}
}
//***************************************************************************//
void CSortView::InsertionSort() //---------------------------插入排序
{
m_IsRun=1;
int i,j;
for(i=2;i<=n;i++)
{
pdata[0]=pdata[i];
ReDraw(0,1);
j=i-1;
showij(i,j);
while(pdata[0]->key<pdata[j]->key)
{
showij(i,j);
ReDraw(0,2);
ReDraw(j,4);
pdata[j+1]=pdata[j--];
}
ReDraw(0,3);
pdata[j+1]=pdata[0];
}
m_IsRun=0;
}
//***************************************************************************//
void CSortView::BubbleSort()//------------------------------冒泡排序
{
m_IsRun=1;
int i,j,flag=0;
for(i=1;i<n;i++)
{
flag=1;
for(j=1;j<=n-i;j++)
{
if(pdata[j]->key>pdata[j+1]->key)
{
flag=0;
showij(i,j);
ReDraw(j,1);
ReDraw(j+1,3);
ReDraw(j,4);
ReDraw(j+1,2);
ReDraw(j,3);
ReDraw(j+1,1);
pdata[0]=pdata[j];
pdata[j]=pdata[j+1];
pdata[j+1]=pdata[0];
}
}
if(flag)
break;
}
m_IsRun=0;
}
//***************************************************************************//
void CSortView::SelectionSort()//选择排序
{
m_IsRun=1;
int i,j,pos;
for(i=1;i<n;i++)
{
pos=i;
for(j=i+1;j<=n;j++)
if(pdata[j]->key<pdata[pos]->key)
pos=j;
if(pos!=i)
{
showij(i,pos);
ReDraw(i,1);
ReDraw(pos,3);
for(int t=1;t<=pos-i;t++)
{
ReDraw(i,4);
ReDraw(pos,2);
}
ReDraw(i,3);
ReDraw(pos,1);
pdata[0]=pdata[i];
pdata[i]=pdata[pos];
pdata[pos]=pdata[0];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -