?? 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, // 消息處理函數(shù)
NULL); // 對話框初始化的值,在WM_INITDIALOG消息的lParam參數(shù)中取出
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);
}
//獲取代碼結(jié)束時cpu內(nèi)部計數(shù)器的值,并減去初值
__asm
{
RDTSC
mov HighEnd, edx
Mov LowEnd, eax
;獲取兩次計數(shù)器值得差
sub eax, LowStart
cmp eax, 0 ; 如果低32的差為負(fù)則求返,因為第二次取得永遠(yuǎn)比第一次的大
jg L1
neg eax
jmp L2
L1: mov numlow, eax
L2: sbb edx, HighStart
mov numhigh, edx
}
//把兩個計數(shù)器值之差放在一個64位的整形變量中
//先把高32位左移32位放在64的整形變量中,然后再加上低32位
timer =(numhigh<<32) + numlow;
//輸出代碼段運行的時鐘周期數(shù)
//以頻率1.1Gcpu為例,如果換計算機把其中的1.1改乘其它即可,因為相信大家的cpu都應(yīng)該在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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -