C++ 精确计算运行时间

2009年11月05日 03:50

最近在宿舍老是不能上网,非常郁闷……还是好好看书吧

做着实验,搜了半天,好歹找个看得懂了

#include <windows.h>
#include <iostream>
using namespace std;

int main()
{
    int jingDu=10000000;
    LARGE_INTEGER frequency,nStartCounter,nStopCounter;
    QueryPerformanceFrequency(&frequency);

    QueryPerformanceCounter(&nStartCounter);

    for(int i=0; i< 100; i++)
        cout << i << endl;

    QueryPerformanceCounter(&nStopCounter);

    double time=((nStopCounter.QuadPart - nStartCounter.QuadPart) * jingDu)/frequency.QuadPart;

    cout << "i lives " << time/jingDu << " second" << endl;
//    TCHAR buffer[100];
//    wsprintf(buffer,"執行時間 %d millisecond ",time);
//    MessageBox(NULL,buffer,"計算時間",MB_OK);
}

评论(0) 阅读(1513)

C++ 自然归并排序

2009年10月25日 22:06

课本上没有源码,但看起来思路不错,于是自己写了个

    void NaturalMergeSort(T a[], int n)
    {
        T *ta = new T [n];//临时数组
        int b[n];//包含各有序子序列断点
        int lenb=0;
        b[lenb++]=-1;//b[0]始终指首
        for (int i=0; i<n-1 ; i++ )//分断点
            if(a[i]>a[i+1]) b[lenb++]=i;
        b[lenb++]=n-1;//指尾

        while(lenb>2)//不断合并
        {
            int i=0,newlenb=1;
            for (i=0; i<lenb-2; i+=2)
            {
                Merge(a, ta, b[i]+1, b[i+1], b[i+2]);//相邻的两个两个合并
                for (int j=b[i]; j<=b[i+2]; j++ )//拷回
                    a[j]=ta[j];
                b[newlenb++]=b[i+2];//b一定越来越小,所以可以重复利用
            }

            if(i==lenb-2) b[newlenb++]=b[lenb-1];//处理最后的孤点
            lenb=newlenb;
        }
    }

    void Merge(T c[], T d[], int l, int m, int r)
    {
        // Merge c[l:m]] and c[m:r] to d[l:r].
        int i = l,    // cursor for first segment
                j = m+1,  // cursor for second
                    k = l;    // cursor for result

        // merge until i or j exits its segment
        while ((i <= m) && (j <= r))
            if (c[i] <= c[j]) d[k++] = c[i++];
            else d[k++] = c[j++];

        // take care of left overs
        if (i > m) for (int q = j; q <= r; q++)
                d[k++] = c[q];
        else for (int q = i; q <= m; q++)
                d[k++] = c[q];
    }

 

评论(0) 阅读(1993)

汇编 10进制转16进制 冒泡排序

2009年10月24日 06:16

最后一个汇编实验里用到的,这两个还是很有用的,于是贴上来

.model small
.stack 200h
.data
BUF  DB 255 DUP(?)
NUMBER DW ?
FLAG DB ?
LEN DB 5
CRLN DB 0AH,0DH,24H
TEMP DW 0,1,10,100,1000,10000
.CODE

NEWLINE macro
        LEA DX,CRLN
        mov ah,9
        int 21h
ENDM

START:
        mov ax,@data
        mov ds,ax

        MOV BUF,'-'
        MOV BUF+1,'5'
        MOV BUF+2,'3'
        MOV BUF+3,'3'
        MOV BUF+4,'4'
       
        XOR SI,SI ;第几个字符
        XOR BH,BH
        MOV BL,LEN ;bx 长度
        ADD BX,BX
        XOR CX,CX ;保存最后结果
        MOV DL,BUF[SI] ;检负
        CMP DL,'-'
        JNE OP
        MOV FLAG,1
        INC SI
        SUB BX,2
OP:
        MOV AX,TEMP[BX] ;保存基数
        XOR DH,DH
        MOV DL,BUF[SI] ;基数要乘的数码
        SUB DL,30H
        IMUL DX
        ADD CX,AX
        INC SI
        SUB BX,2
        JNZ OP

        MOV AL,FLAG
        CMP AL,0
        JE OP2
        NEG CX
OP2:
        MOV AX,CX
        CALL SHOWAXD
        MOV FLAG,0

        ;暂停,任意键关闭
        mov ah,1
        int 21h
        mov ah,4ch     ;结束,可以修改al设置返回码
        int 21h

SHOWAXD PROC NEAR USES AX BX CX DX SI
......
SHOWAXD ENDP

END START

 

评论(0) 阅读(2741)

黑塞的童话《侏儒》(Der Zwerg)

2009年10月23日 01:17

这是我找了很多年的的那个童话故事。等我找到www.hesse-cn.com时它已经打不开了,谷歌上只有这篇翻译了。老实说,这篇翻译的很差,还删了那句对我最重要的话,最后我是在豆瓣小组里找到那句话的。如果某天回家,还能再找到小时候那本书的话,我就自己打上来。
“世界上到处都是聪明人给蠢人当差,对大多数人来说,生活只不过是一场不成功的闹剧。”
 

评论(0) 阅读(1214)

将AX以10进制显示出来

2009年10月22日 20:00

写汇编实验7遇到的问题,以前懒,这次只好硬着头皮写了

ret曾因为前面循环而少push了一次,不停在子程序里循环跳不出来了

以前看书时不以为然,这次可算是亲身体会了

评论(0) 阅读(1360)