网学网为需要VC与C++类别的朋友们搜集整理了VC++多种排序算法研究相关资料,希望对各位网友有所帮助!
客服咨询,网学网竭诚为您服务,本站永久域名:myeducs.cn | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1.1 动态演示冒泡算法模块设计 首先,本系统是在Visual C++ 6.0中文版下MFC 环境下,设置的“MFC AppWizard(exe)”工程,工程名为:“tt”。相关的ID如表4_1,4_2所示 表4-1 为工程添加IDR_MAINFRAME的菜单选项
表4-2 打开类向导(Class Wizard)对话框向视图类添加响应函数
表4-3 通过类查看(ClassView)选项卡,向视图类添加成员变量
打开ttView.h头文件,在文件开始部分定义两个常量: #define N 70 //设定排序的记录次数 #define DELAY 3 //每次交换操作所耗 #define DELAY1 1 //每次比较操作所耗的时间 并在其下声明冒泡排序的全局函数: UINT ThreadSortBubble(LPVOID lp); 由于开启多线程时,使用的都是全局函数,想要获得当前视图类中的数据,并实时更新试图的显示,就必须获取当前试图对象。所以本系统要定义一个全局指针,打开ttView.cpp构建函数中加入语句“CTtView *pView”用来获取当前视图。 然后,系统在ttView.cpp构建文件中添加实现冒泡排序算法的函数:ThreadSortBubble,代码为: UINT ThreadSortBubble(LPVOID lp) { int * data; int i,j,key; int tag; data=pView->m_SortBubble; for(i=0;i<N;i++) { tag=0; for(j=N-1;j>i;j--) { if(data[j]>data[j-1]) { key=data[j]; data[j]=data[j-1]; data[j-1]=key; Sleep(DELAY); pView->Invalidate(TRUE); tag++; } Sleep(DELAY1); } if(tag==0) break; } pView->Invalidate(TRUE); return 0; } 在类中查看(Class View)选项,打开视图类CTtView,在其中修改构建函数,实现变量初始化: CTtView::CTtView() { int i; srand((unsigned)time(NULL)); for(i=0;i<N;i++) m_SortBubble[i] =0; pView=this; IsSortBubble=FALSE; } 为了让大家看清楚排序之间对比和交换的过程,修改响应函数“OnSortBubble”,产生0-70随即整数来进行排序: void CTtView::OnSortBubble() { for(int i=0;i<N;i++) { m_SortBubble[i]=(int)((double)rand()*70.0/(double)RAND_MAX); } IsSortBubble=TRUE; AfxBeginThread(ThreadSortBubble,GetSafeHwnd()); } 最后修改OnDraw函数,利用画刷实现动态绘制: void CTtView::OnDraw(CDC* pDC) { int i; CTtDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if(IsSortBubble) { CBrush BlueBrush(RGB(0,255,0)); pDC->TextOut(250,200,"冒泡排序演示");// for(i=0;i<N;i++) { m_SortBubbleRect.bottom=170; m_SortBubbleRect.left=250+i*2; m_SortBubbleRect.right=m_SortBubbleRect.left+1; m_SortBubbleRect.top=m_SortBubbleRect.bottom-m_SortBubble[i]; pDC->FillRect(&m_SortBubbleRect,&BlueBrush); } BlueBrush.DeleteObject(); } 1.2 动态演示选择算法模块设计 表4-4 为工程添加IDR_MAINFRAME的菜单选项
表4-5 打开类向导(Class Wizard)对话框向视图类添加响应函数
表4-6 通过类查看(ClassView)选项卡,向视图类添加成员变量
在TtView.h头文件,声明选择排序的全局函数: UINT ThreadSortSelect(LPVOID lp); 然后,在TtView.cpp构建文件中添加实现选择排序算法的函数:ThreadSortSelect,代码为: UINT ThreadSortSelect(LPVOID lp) { int i,j,key,tmp; int *data; data=pView->m_SortSelect; for(i=0;i<N-1;i++) { key=i; for(j=i+1;j<N;j++) { if(data[j]>data[key]) { key=j; pView->Invalidate(TRUE); } Sleep(DELAY1); } Sleep(DELAY); tmp=data[i]; data[i]=data[key]; data[key]=tmp; } Sleep(DELAY); pView->Invalidate(TRUE); return 0; } 在类中查看(Class View)选项,打开视图类CTtView,在其中修改构建函数,实现变量初始化: CTtView::CTtView() { int i; srand((unsigned)time(NULL)); for(i=0;i<N;i++) m_SortSelect[i] =0; pView=this; IsSortSelect=FALSE; } 修改响应函数“OnSortSelect”,产生0-70随即整数来进行排序: void CTtView::OnSortSelect() { for(int i=0;i<N;i++) { m_SortSelect[i]=(int)((double)rand()*70.0/(double)RAND_MAX); } IsSortSelect=TRUE; AfxBeginThread(ThreadSortSelect,GetSafeHwnd()); } 最后修改OnDraw函数,利用画刷实现动态绘制: void CTtView::OnDraw(CDC* pDC) { int i; CTtDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if(IsSortSelect) { CBrush BlueBrush(RGB(0,255,0)); pDC->TextOut(50,200,"选择排序演示"); for(i=0;i<N;i++) { m_SortSelectRect.bottom=170; m_SortSelectRect.left=50+i*2; m_SortSelectRect.right=m_SortSelectRect.left+1; m_SortSelectRect.top=m_SortSelectRect.bottom-m_SortSelect[i]; pDC->FillRect(&m_SortSelectRect,&BlueBrush); } BlueBrush.DeleteObject(); } 1.3 动态演示快速算法模块设计 表4-7 为工程添加IDR_MAINFRAME的菜单选项
表4-8 打开类向导(Class Wizard)对话框向视图类添加响应函数
表4-9 通过类查看(ClassView)选项卡,向视图类添加成员变量
在TtView.h头文件,声明选择排序的全局函数: UINT ThreadSortQuick(LPVOID lp); void QuickSort(int * data,int s,int t); 在TtView.cpp构建文件中添加实现快速排序算法的函数:ThreadSortSelect和QuickSort,代码为: void QuickSort(int * data,int low,int high) { int i=low,j=high; int tmp,key; if(low<high) { tmp=data[low]; while(i<j) { while(i<j) { if(data[j]<=tmp) { j--; Sleep(DELAY1); } else { break; } } key=data[i]; data[i]=data[j]; data[j]=key; Sleep(DELAY); pView->Invalidate(TRUE); while(i<j) { if(data[i]>=tmp) { i++; Sleep(DELAY1); } else { break; } } key=data[i]; data[i]=data[j]; data[j]=key; Sleep(DELAY); pView->Invalidate(TRUE); } QuickSort(data,low,i-1); QuickSort(data,i+1,high); } } UINT ThreadSortQuick(LPVOID lp) { int * data; data=pView->m_SortQuick; pView->Invalidate(TRUE); Sleep(DELAY); QuickSort(data,0,N-1); return 0; } 打开类(Class View)中视图类CTtView,在其中修改构建函数,实现变量初始化: CTtView::CTtView() { int i; srand((unsigned)time(NULL)); for(i=0;i<N;i++) m_SortQuick[i] =0; pView=this; IsSortQuick=FALSE; } 修改响应函数“OnSortQuick”,产生0-70随即整数来进行排序: void CTtView::OnSortQuick() { for(int i=0;i<N;i++) { m_SortQuick[i]=(int)((double)rand()*700.0/(double)RAND_MAX); } IsSortQuick=TRUE; AfxBeginThread(ThreadSortQuick,GetSafeHwnd()); } 最后修改OnDraw函数,利用画刷实现动态绘制: void CTtView::OnDraw(CDC* pDC) { int i; CTtDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if(IsSortQuick) { CBrush BlueBrush(RGB(0,255,0)); pDC->TextOut(450,200,"快速排序演示");// for(i=0;i<N;i++) { m_SortQuickRect.bottom=170; m_SortQuickRect.left=450+i*2; m_SortQuickRect.right=m_SortQuickRect.left+1; m_SortQuickRect.top=m_SortQuickRect.bottom-m_SortQuick[i]; pDC->FillRect(&m_SortQuickRect,&BlueBrush); } BlueBrush.DeleteObject(); } 1.4 同时比较三种算法模块设计 表4-10 为工程添加IDR_MAINFRAME的菜单选项
表4-11 打开类向导(Class Wizard)对话框向视图类添加响应函数
同时比较这三种排序,就是同时调用这三种排序演示线程,修改响应函数OnSortAll: void CTtView::OnSortAll() { // TODO: Add your command handler code here OnSortBubble1(); OnSortQuick1(); OnSortSelect1(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
本站发布的计算机毕业设计均是完整无错的全套作品,包含开题报告+程序+论文+源代码+翻译+答辩稿PPT | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
本文选自计算机毕业设计http://myeducs.cn |