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

📄 sort1.cpp

📁 用VC+ASM做的内排序比较软件
💻 CPP
字号:
#include "windows.h"
#include "winbase.h"
#include <commctrl.h>
#include "resource.h"
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <iostream.h>
#include "source.h"

#pragma comment(lib,"comctl32.lib")

int red=0,n=0;
int r[5000];
BOOL __stdcall DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
					
					PSTR szCmdLine, int iCmdShow)
{
	
	n=Input(r);
	::DialogBoxParam(
		hInstance,		// 实例句柄
		(LPCTSTR)IDD_MAIN,	// 对话框资源ID号
		NULL,			// 父窗口句柄
		DlgProc,		// 消息处理函数
		NULL); 			// 对话框初始化的值,在WM_INITDIALOG消息的lParam参数中取出
	
	
	
	return 0;
}
BOOL __stdcall DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	
	
	char ti[50];
	long HighStart,LowStart,HighEnd,LowEnd;
	long numhigh,numlow;
	double time;
	__int64 timer;
	switch(message)
	{
		
	case WM_INITDIALOG:// 初始化对话框
        
		
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDC_RADIO4:
			{
				if(::IsDlgButtonChecked(hDlg,IDC_RADIO4)==BST_CHECKED)
				{
					red=4;
				}
			}
			break;
		case IDC_RADIO5:
			{
				if(::IsDlgButtonChecked(hDlg,IDC_RADIO5)==BST_CHECKED)
				{
					red=5;
				} 
			}
			break;
		case IDC_RADIO1:
			{
				if(::IsDlgButtonChecked(hDlg,IDC_RADIO1)==BST_CHECKED)
				{
					red=1;
				}
			}
			break;
			
		case IDC_RADIO2:
			{
				if(::IsDlgButtonChecked(hDlg,IDC_RADIO2)==BST_CHECKED)
				{
					red=2;
				} 
			}
			break;
			
		case IDC_RADIO3:
			{
				if(::IsDlgButtonChecked(hDlg,IDC_RADIO3)==BST_CHECKED)
				{
					red=3;
				}		     
			}
			break;
		case IDC_RADIO6:
			{
				if(::IsDlgButtonChecked(hDlg,IDC_RADIO6)==BST_CHECKED)
				{
					red=6;
				}
			}
			break;
			
		case IDOK:
			{	
				__asm         
				{
					RDTSC 
						mov HighStart, edx
						mov LowStart, eax
				}
				if(red==1)
				{
					
					QuickSort(r,n-1);
					
				}
				else if(red==2)
				{
					
					ExchangeSort(r,n);
				}
				else if(red==3)
				{
					
					HeapSort(r,n-1);
				}
				else if(red==4)
				{
					
					SelectSort(r,n);
				}
				else if(red==5)
				{
					
					bubble(r,n);
				}
				else if(red==6)
				{
					
					MergeSort(r,n);
				}
				else ::MessageBox(NULL,"error",NULL,IDOK);
			}
			//获取代码结束时cpu内部计数器的值,并减去初值
			__asm
			{
				RDTSC
					mov HighEnd, edx
					Mov LowEnd, eax
					;获取两次计数器值得差
					sub eax, LowStart
					cmp   eax, 0     ; 如果低32的差为负则求返,因为第二次取得永远比第一次的大
					jg   L1
					neg   eax 
					jmp   L2
L1: mov numlow, eax
L2: sbb edx, HighStart
	mov numhigh, edx
	
			}
			//把两个计数器值之差放在一个64位的整形变量中
			//先把高32位左移32位放在64的整形变量中,然后再加上低32位
			timer =(numhigh<<32) + numlow;
			//输出代码段运行的时钟周期数
			//以频率1.1Gcpu为例,如果换计算机把其中的1.1改乘其它即可,因为相信大家的cpu都应该在1G以上 
			time=(double) (timer /2.66/1000000000);
			::sprintf(ti,"排序完毕!用时%eS",time);
			::MessageBox(NULL,ti,"排序时间",MB_OK);
			::EndDialog(hDlg,IDOK);
			ouput(r,n);
			break;
			
		case IDCANCEL:
			::EndDialog(hDlg,IDCANCEL);
			break;
		}
	}
	return 0;
}

⌨️ 快捷键说明

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