QuickSort (MFC )

#include "stdafx.h"
#include <afxmt.h>
#include <iostream>
#include <afxwin.h>
#include "time.h"
#define Num 10000000
using namespace std;
long wht_length;
long  wht_array[Num];
long  wht_array1[Num];
long  wht_array2[Num];
CEvent faxEvent1(false);
CEvent faxEvent2(false);
CEvent faxEvent3(false);
CEvent faxEvent(false);
/*
* 函数名: QuickSort
* 功能:对起止位置为wht_start和wht_end的数组序列,进行串行快速排序。
* 输入:无序数组wht_array[1,wht_n]
* 返回:有序数组wht_array[1,wht_n]
*/
int QuickSort(long R[],long  wht_start, long wht_end)
{
	long i=wht_start,j=wht_end;
	long  wht_tmp;
	if(wht_start<wht_end)
	{
		wht_tmp=R[wht_start];
		while(i!=j)
		{
			while(j>i&&wht_array[j]>=wht_tmp)
				j--;
			wht_array[i]=wht_array[j];
			while(i<j&&R[i]<=wht_tmp)
				i++;
			wht_array[j]=wht_array[i];
		}
		wht_array[i]=wht_tmp;
		QuickSort(wht_array,wht_start,i-1);
		QuickSort(wht_array,i+1,wht_end);
	}
	return 0;
}
/*
* 函数名: QuickSort1
* 功能:对起止位置为wht_start和wht_end的数组序列,进行串行快速排序。
* 输入:无序数组wht_array[1,wht_n/2]
* 返回:有序数组wht_array[1,wht_n/2]
*/
int QuickSort1(long wht_array1[],long  wht_start, long wht_end)
{
	long i=wht_start,j=wht_end;
	long  wht_tmp;
	if(wht_start<wht_end)
	{

		wht_tmp=wht_array1[wht_start];
		while(i!=j)
		{
			while(j>i&&wht_array1[j]>=wht_tmp)
				j--;
			wht_array1[i]=wht_array1[j];
			while(i<j&&wht_array1[i]<=wht_tmp)
				i++;
			wht_array1[j]=wht_array1[i];
		}
		wht_array1[i]=wht_tmp;
		QuickSort1(wht_array1,wht_start,i-1);
		QuickSort1(wht_array1,i+1,wht_end);
	}
	return 0;
}
 /*
* 函数名: Merge
* 功能:对已经排好顺序的两个数组进行归并排序形成一个有序数组。
* 输入:有序数组wht_array2[1,wht_n/2],wht_array1[1,wht_n/2]
* 返回:有序数组wht_array[1,wht_n]
*/
void Merge(long  wht_array[],long wht_start,long wht_mid,long wht_length)
{   long *wht_array_temp;
	long i=wht_start,j=wht_mid+1,wht_k=0;
	wht_array_temp=(long *)malloc((wht_length-wht_start+1)*sizeof(long));
	while(i<=wht_mid&&j<=wht_length)
		if(wht_array[i]<=wht_array[j])
		{
			wht_array_temp[wht_k]=wht_array[i];
			i++;wht_k++;
		}
		else
		{
			wht_array_temp[wht_k]=wht_array[j];
			j++;wht_k++;
		}
		while(i<=wht_mid)
		{
			wht_array_temp[wht_k]=wht_array[i];
			i++;wht_k++;

		}
		while(j<=wht_length)
		{
			wht_array_temp[wht_k]=wht_array[j];
			j++;wht_k++;
		}
		for(wht_k=0,i=wht_start;i<=wht_length;wht_k++,i++)
			wht_array[i]=wht_array_temp[wht_k];
		free(wht_array_temp);
}
UINT threadProc4(LPVOID param){
	{QuickSort(wht_array,0,wht_length/2-1);}
	SetEvent(faxEvent1);
	return 0;
}
UINT threadProc5(LPVOID param){
	{QuickSort(wht_array,wht_length/2,wht_length-1);}
	SetEvent(faxEvent2);
	return 0;
}
UINT threadProc6(LPVOID param){
	{Merge(wht_array,0,wht_length/2-1, wht_length-1);}
	SetEvent(faxEvent3);
	return 0;
}
UINT threadProc7(LPVOID param){
	{ QuickSort1(wht_array1,0,wht_length-1);}
	SetEvent(faxEvent);
	return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
	//cout<<"MFC实现"<<endl;
	//cout<<"输入数组长度:=";
	//cin>>wht_length;
//	while(TRUE)
	{
		printf("请输入生成的随机数的个数:");
		cin>>wht_length;
		/*读出正确的cin>>wht_length;,返回;否则,继续要求输入*/
//		if((wht_length>=90000) && (wht_length<=10000000))
		{
//			break;
		}
//		printf("输入错误,数字范围是 [90000~100000]");
	}
	cout<<"随机数生成:"<<endl;
	srand(396);
	for(int i=0;i<wht_length;i++)
	{
	wht_array[i]=rand();//产生随机数
	wht_array1[i]=wht_array[i];
	cout<<wht_array[i]<<" ";
	}
	cout<<endl;
	clock_t t1=clock();
    AfxBeginThread(threadProc7,NULL);
	WaitForSingleObject(faxEvent,INFINITE);
	clock_t t2=clock();
	cout<<"串行结果"<<endl;
	for(int i=0;i<wht_length;i++)
		cout<<wht_array[i]<<" ";
	cout<<endl;
	double cost1=t2-t1;
	cout<<"串行时间:="<<cost1<<endl;
	clock_t t3=clock();
	AfxBeginThread(threadProc4,NULL);
	AfxBeginThread(threadProc5,NULL);
	WaitForSingleObject(faxEvent1,INFINITE);
	WaitForSingleObject(faxEvent2,INFINITE);
	AfxBeginThread(threadProc6,NULL);
	WaitForSingleObject(faxEvent3,INFINITE);
	clock_t t4=clock();
	cout<<"并行结果:"<<endl;
	for(int i=0;i<wht_length;i++)
		cout<<wht_array[i]<<" ";
	cout<<endl;
	double cost2=t4-t3;
	cout<<"并行时间:="<<cost2<<endl;
	cout<<"加速比为:"<<cost1/cost2<<endl;
	system("pause");
	return 0;
}

时间: 2024-08-13 11:02:35

QuickSort (MFC )的相关文章

《深入浅出MFC》第七章 简单而完整:MFC骨干程序

不二法门:熟记MFC类层次结构.经常使用的主要MFC类:CWinApp, CWnd<-CView, CWnd<-CFrameWnd, CFrameWnd<-CMDIFrameWnd, CFrameWnd<-CMDIChildWnd, CWnd<-CDialog, CWnd<-CControlBar, CControlBar<-CStatusBar, CControlBar<-CToolBar, CCmdTarget<-CDocument, CCmdTa

深入浅出MFC——消息映射与命令传递(六)

1. 消息分类: 2. 万流归宗——Command Target(CCmdTarget): 3. "消息映射"是MFC内建的一个信息分派机制.通过三个宏(DECLARE_MESSAGE_MAP/BEGIN.../ON.../END...)完成消息网的建构. 4. 注意:CWinThread派生自CCmdTarget,但没有DECLARE_/BEGIN_/END_宏组. 5. 消息映射与虚函数: 6.

MFC控件使用技巧:List Control

1)每列内容过长,显示不完整 只有加载数据的情况下,才会出现水平滚动条 解决方案: 可以添加如下一个空的内容项: m_List.InsertItem(0,NULL);//为了显示进度条 2)不允许点击修改第一列(当然最多能够让我们改动的也只有他了) MFC默认情况下可以修改第一列,其他的不允许修改(需要定制DrawItem) 解决方案: Edit Labels 属性设置为 False 3)报表的形式表示 View 属性设置为 Report 4)注意:不要和列表框控件混淆(英文名: List Bo

【mfc】用对话框分页实现用户登录

所谓的对话框分页就是点击完一个对话框的按钮,切换到另一个对话框, 这样的对话框多用于一些需要用户登录才能够进行操作的软件, 下面就用对话框分页来实现用户登录系统 一.基本目标 有如下的程序,输入用户名与密码,如果用户名为admin,密码为123456,那么则成功登录,切换到一个有"欢迎登录"与"关闭"按钮的对话框 如果用户名或者密码输入错误则弹出提示, 点击关闭能够关闭这个程序,不弹出用户登录的对话框. 二.制作过程 1.首先如同之前的<[mfc]对于对话框程

MFC中给控件添加变量,DoDataExchange中

DoDataExchange函数其实是一项数据动态绑定技术.比如你在写动态按钮过程中须对按钮添加变量时,怎么添加?控件类已经写好了,其变量是已经固定的.你要添加新的变量就要用到DoDataExchange函数. 你要在对话框的构造函数里面初始化一个变量,再用DoDataExchange函数将它绑定到你的动态按扭中,比如:DDX_Check(pDX, IDC_CHECK1, m_Lesson1);这就是将m_Lesson1(这是一个外部变量,其定义在对话框的构造函数里)绑定到IDC_CHECK1中

MFC消息映射的原理:笔记

多态的实现机制有两种,一是通过查找绝对位置表,二是查找名称表:两者各有优缺点,那么为什么mfc的消息映射采用了第二种方法,而不是c++使用的第一种呢?因为在mfc的gui类库是一个庞大的继承体系,而里面的每个类有很多成员函数(只说消息反映相关的成员函数啊),而且在派生类中,需要改写的也比较少(我用来做练习的程序就是那么一两个,呵呵).那么用c++的虚函数的实现机制会导致什么问题呢?就是大量虚表的建立使得空间浪费掉很多. 嗯-怎么办呢?于是各大c++名库(比如QT,MFC,VCL-)在消息映射的实

MFC-消息分派

前言 由于工作需要,这几天学了一点MFC,在AFX里看到很多熟悉的东西,如类型信息,序列化,窗口封装和消息分派.几乎每个界面库都必须提供这些基础服务,但提供的手法却千差万别.MFC大量地借用了宏,映射表来实现,而VCL则更多的在语言级别上给与支持.这其实是很容易理解的,因为C++是一个标准,不会因某个应用而随便扩展语言:相反Delphi完全由一个公司掌握,因此每支持一项新技术,变化最大的往往是语言本身. 学习MFC的代码,再对照VCL的实现,这真是一个很有意思的过程,其中可以看到两个框架在一些设

MFC中的DC CDC HDC由来由去理解

MFC中的DC CDC HDC由来由去理解 在此非常感谢博客主的究竟钻研,非常详细的参考资料:http://blog.csdn.net/yam_killer/article/details/7661449

(七):处理MFC

(一):简单介绍 为了可以在一个Winelib应用中使用MFC,你须要首先使用Winelib又一次编译MFC. 在理论上,你应该为Windows的MFC编写一个封装(怎样编写在后面介绍).可是,在实践中,对MFC来说.可能不是一个真正的解决方案: 数量巨大的API使得编写封装的工作量非常大 进一步说.MFC包括大量的API.这些API在制作封装的时候处理起来是非常复杂的. 即使你编写了封装,你也须要去改动MFC的头文件以使编译器不会堵塞他们. 在你应用中的非常大一部分MFC代码是以宏的形式展现的