⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sortview.cpp

📁 数据结构与算法的排序算法演示,这是我上大学的时候做的实验,里面展示了几种常用的排序算法的算法演示,如插入排序,选择排序,快速排序,堆排序.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -