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

📄 comparesortdlg.cpp

📁 在对本程序的快速排序和归并排序这两种算法的正确与否进行验证时
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	m_Slider.SetRange(1,20);             //设置滑尺在单缝轨道上的移动范围
	m_Slider.SetPos(1);
	m_Slider.SetTicFreq(1);              //设置单缝轨道的刻度
	m_Slider.SetLineSize(1);             //设置按左右箭头或鼠标单击单缝轨道时滑尺的移动量
	m_Result="";
	m_Sorce="";
	UpdateData(FALSE);
	GetDlgItem(IDC_INPUT)->EnableWindow(TRUE);	
}

//********************响应滑尺的变化*****************************
void CCompareSortDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) //响应滑尺的变化
{
	// TODO: Add your message handler code here and/or call default
	m_Sorce="";
	m_Result="";
	m_Num=m_Slider.GetPos();
	UpdateData(FALSE);
	//设置各个按钮的有效性
	GetDlgItem(IDC_SHOWSORCE)->EnableWindow(FALSE);
    GetDlgItem(IDC_SHOWRESULT)->EnableWindow(FALSE);
	GetDlgItem(IDC_CLEANSORCE)->EnableWindow(FALSE);
	GetDlgItem(IDC_CLEANRESULT)->EnableWindow(FALSE);
	GetDlgItem(IDC_QUICKSORT)->EnableWindow(FALSE);
	GetDlgItem(IDC_MERGESORT)->EnableWindow(FALSE);
	GetDlgItem(IDC_INPUT)->EnableWindow(TRUE);
	
	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

//********************响应输入数据键*****************************
void CCompareSortDlg::OnInput()             //输入数据函数
{
	// TODO: Add your control notification handler code here
	m_Sorce="";
	m_Result="";
	UpdateData(FALSE);
	//申请空间
	Sort.Size=m_Num;
	Sort.A=new int[m_Num+1];
	assert(Sort.A);
	Sort.B=new int[m_Num+1];
	assert(Sort.B);
	Sort.C=new int [m_Num+1];
	assert(Sort.C);
	D=new int[m_Num+1];
	assert(D);
	if(m_AutoRun==1)                //用户输入
	{
		CInputDialog dlg;
		dlg.Num=m_Num;
		dlg.m_Number=m_Num;
		if(dlg.DoModal()==IDOK) //弹出输入对话框
		{ 
			
			dlg.m_Input+=',';
			int i,j=0;
			for(i=1;i<=m_Num;i++)
			{
				int th=0;
				while(dlg.m_Input[j]!=',')  //把字符串转换成数据
				{
					th=th*10+dlg.m_Input[j]-48;
					j++;
				}//while
				Sort.A[i]=th;
				Sort.B[i]=Sort.A[i];
				D[i]=Sort.B[i];
				j++;
			}
		}
	}
	else                             //随机产生
	{
		srand(time(NULL));
		for(int i=1;i<=m_Num;i++)
		{
			Sort.A[i]=rand();         //产生随机整数
			Sort.B[i]=Sort.A[i];
			D[i]=Sort.B[i];
		}
	}//else
	Qflag=0;                         //置0表示未排序
	Mflag=0;
	//设置各个按钮的有效性
//	if(m_Auto==1)
//	{
		GetDlgItem(IDC_SHOWSORCE)->EnableWindow(TRUE);
		GetDlgItem(IDC_CLEANSORCE)->EnableWindow(TRUE);
//	}
	GetDlgItem(IDC_QUICKSORT)->EnableWindow(TRUE);
    GetDlgItem(IDC_MERGESORT)->EnableWindow(TRUE);
	GetDlgItem(IDC_SHOWRESULT)->EnableWindow(FALSE);
	GetDlgItem(IDC_CLEANRESULT)->EnableWindow(FALSE);	
}

//********************响应显示初始化数据键****************************
void CCompareSortDlg::OnShowsorce()       //显示初始数据
{
	// TODO: Add your control notification handler code here
	if(m_AutoRun==0)
	{
		if(AfxMessageBox("由于数据太多,显示较长一定的时间!真要显示数据吗?",MB_YESNO)==IDNO)
			return;
	}
	char a[10];
	for(int i=1;i<=m_Num;i++)             //转化为CString类
	{
		sprintf(a,"%d",D[i]);
		m_Sorce+=a;
		if(i<m_Num)
		m_Sorce+="  ";
	}
	UpdateData(FALSE);
	GetDlgItem(IDC_SHOWSORCE)->EnableWindow(FALSE);
}

//********************响应快速排序键****************************
void CCompareSortDlg::OnQuicksort() 
{
	// TODO: Add your control notification handler code here
    if(Mflag==0)                    //还未执行归并排序
		counter++;                  //排序组数加1
	Qflag=1;                        //表示已执行快速排序
	if(m_AutoRun==0)
		GetDlgItem(IDC_INPUT)->EnableWindow(FALSE);
	m_Result="";
	UpdateData(FALSE);
    //设置计时函数
	LARGE_INTEGER litmp; 
    LONGLONG QPart1,QPart2;
    int dfMinus, dfFreq; 
    QueryPerformanceFrequency(&litmp);
    dfFreq = (int)litmp.QuadPart;       // 获得计数器的时钟频率
    QueryPerformanceCounter(&litmp);
    QPart1 = litmp.QuadPart;            // 获得初始值 

	Sort.QuickSort();                   //快速排序

	QueryPerformanceCounter(&litmp);
	QPart2=litmp.QuadPart;              //获得中止值
	dfMinus=(int)(QPart2-QPart1);
	Sort.QTime=(1000*dfMinus)/dfFreq;   //获得对应的时间值,计时完成
	Time[counter].Num=m_Num;
	Time[counter].QTime=Sort.QTime;
	//设置各个按钮的有效性
	if((m_AutoRun==0)&&(counter<=20))        //当随机产生并且counter小于21时
		DrawTime(1,m_Num,Sort.QTime);
    if((Qflag==1)&&(Mflag==1))            //排序后输入按钮有效
		GetDlgItem(IDC_INPUT)->EnableWindow(TRUE);
	GetDlgItem(IDC_QUICKSORT)->EnableWindow(FALSE);
	GetDlgItem(IDC_SHOWRESULT)->EnableWindow(TRUE);
	GetDlgItem(IDC_CLEANRESULT)->EnableWindow(TRUE);

}

//********************响应归并排序键****************************
void CCompareSortDlg::OnMergesort() 
{
	// TODO: Add your control notification handler code here
	if(Qflag==0)                    //还未执行快速排序
		counter++;                  //排序组数加1
	Mflag=1;                        //表示已执行归并排序
	if(m_AutoRun==0)
		GetDlgItem(IDC_INPUT)->EnableWindow(FALSE);
	m_Result="";
	UpdateData(FALSE);
	//设置计时函数
	LARGE_INTEGER litmp; 
    LONGLONG QPart1,QPart2;
    int dfMinus, dfFreq; 
    QueryPerformanceFrequency(&litmp);
    dfFreq = (int)litmp.QuadPart;    // 获得计数器的时钟频率
    QueryPerformanceCounter(&litmp);
    QPart1 = litmp.QuadPart;         // 获得初始值 

    Sort.MergeSort();                //排序

	QueryPerformanceCounter(&litmp);
	QPart2=litmp.QuadPart;           //获得中止值
	dfMinus=(int)(QPart2-QPart1);
	Sort.MTime=(1000*dfMinus)/dfFreq;//获得对应的时间值,计时完成

	Time[counter].Num=m_Num;
	Time[counter].MTime=Sort.MTime;
	if((m_AutoRun==0)&&(counter<=20))
		DrawTime(2,m_Num,Sort.MTime);//输出所用时间

	GetDlgItem(IDC_SHOWRESULT)->EnableWindow(TRUE);
   	GetDlgItem(IDC_CLEANRESULT)->EnableWindow(TRUE);
    if((Qflag==1)&&(Mflag==1))
		GetDlgItem(IDC_INPUT)->EnableWindow(TRUE);
    GetDlgItem(IDC_MERGESORT)->EnableWindow(FALSE);

}

//********************响应输出排序后数据键**********************
void CCompareSortDlg::OnShowresult() //显示结果函数
{
	// TODO: Add your control notification handler code here
	if(m_AutoRun==0)
	{
		if(AfxMessageBox("由于数据太多,显示需要较长的时间!真要显示数据吗?",MB_YESNO)==IDNO)
			return;
	}
	if(Qflag==1)
		OutPut(Sort.A,Sort.Size);
	else
		OutPut(Sort.B,Sort.Size);	
	GetDlgItem(IDC_SHOWRESULT)->EnableWindow(FALSE);
}
void CCompareSortDlg::OutPut(int* A,int Num)  //输出结果
{
	char a[10];
	for(int i=1;i<=Num;i++)             //转化为CString类
	{
		sprintf(a,"%d",A[i]);
	    m_Result+=a;
		if(i<Num)
			m_Result+="  ";
	}
	UpdateData(FALSE);
}

//********************响应显示初始化数据键下的Clean键****************************
void CCompareSortDlg::OnCleansorce()        //清空显示的初始数据
{
	// TODO: Add your control notification handler code here
	m_Sorce="";
	UpdateData(FALSE);
	GetDlgItem(IDC_SHOWSORCE)->EnableWindow(TRUE);

}

//********************响应输出排序后数据键下的Clean键****************************
void CCompareSortDlg::OnCleanresult()        //清空显示的结果
{
	// TODO: Add your control notification handler code here
	m_Result="";
	UpdateData(FALSE);
	GetDlgItem(IDC_SHOWRESULT)->EnableWindow(TRUE);
	
}

//********************输出排序时间的函数**************************
void CCompareSortDlg::DrawTime(int flag, int Num, int Time)  //输出排序时间
{
	CString str1,str2;
	CRect rect;
	GetClientRect(&rect);    //获得客户窗口的大小
	CClientDC dc(this);
	Num=Num/5000;
	str1.Format("%d",Num);   //转换成字符串
	dc.SetTextColor(RGB(0,255,255));
	dc.TextOut(143+30*Num,rect.Height()-165,str1);
	str2.Format("%d",Time);
	if(flag==1)               //输出快速排序的时间
	{
		dc.SetTextColor(RGB(0,255,0));
		dc.TextOut(142+30*Num,rect.Height()-135,str2);
	}
	else                      //输出归并排序的时间
	{
		dc.SetTextColor(RGB(255,0,0));
		dc.TextOut(142+30*Num,rect.Height()-105,str2);
	}
}

//********************响应退出键**********************************
void CCompareSortDlg::OnCancel() //退出该程序
{
	// TODO: Add extra cleanup here
	
	CDialog::OnCancel();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -