📄 sort1.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 + -