编程之美1.3 饼问题

使用gettickcount获取时间 测试效率

饼问题:

我的思路:

(1)选出最大饼

(2)起始饼到最大饼进行翻转

(3)最大饼在最上,再全部翻转,最大饼在最下面

(4)下一次从剩下饼中选出最大,loop

(我考虑的改进):

Developing1:

删除(3),每次从剩下饼中,找最大,loop

Developing2:

在Developing1基础上,对于(1),使用双指针找最大饼【或直接使用双向指针加速】

但是上述两种改进 并不符合题意。。。。

上述算法实现:

思路1:

    ///////////////////程序之美 1.3 算法实现///////我的算法//////////////////////////////////
//为改进
    ///*
    //算法描述:首先找出数组中pBegin和pEnd最大的数,进行翻转 将最大数翻转到顶 在翻转至最下层
    //*/
    const int num = 50000;
    int cake[num];
    int cake1[num],cake2[num],cake3[num];

    srand(GetTickCount());
    for (int i = 0;i < num;i++)
    {
        cake[i] = rand();
        cake1[i] = cake[i];
        cake2[i] = cake[i];
        cake3[i] = cake[i];
    }

    int *pBegin,*pEnd;
    
    pBegin = &cake1[0];
    pEnd = &cake1[num – 1];
    const int *pOrigB = &cake1[0];
    const int *pOrigE = &cake1[num – 1];

    INT64 startTime = GetTickCount();

    while (pEnd != pOrigB)
    {
        int *pMax = pBegin;
        for (int *i = pBegin;i <= pEnd;i++)
        {
            if(*pMax < *i)
                pMax = i;
        }
        Reverse(pBegin,pMax);
        Reverse(pBegin,pEnd);                    //这个比较糟糕 翻转次数过多度 感觉
        pEnd–;
    }

    INT64 totalTime = (GetTickCount() – startTime);

    cout<<“The running time is:”<<totalTime<<endl;

    //for (int i = 0;i < num;i++)
        //printf(” %d “,cake1[i]);


Developing1:

/////////////////程序之美 1.3 算法实现///////我的算法2 改进一下/////////其实并不符合题意 只是翻转速度更快/////////////////////////
//改进最后翻转过程。
    /*
    算法描述:首先找出数组中pBegin和pEnd最大的数,进行翻转 将最大数翻转到顶 在翻转至最下层
    */

    for (int i = 0;i < num;i++)
        cake2[i] = rand()%100;

    int *pBegin2,*pEnd2;
    
    pBegin2 = &cake2[0];
    pEnd2 = &cake2[num – 1];
    int *pOrigB2 = &cake2[0];
    int *pOrigE2 = &cake2[num – 1];

    INT64 startTime2 = GetTickCount();

    while (pBegin2 != pOrigE2)
    {
        int *pMax = pBegin2;
        for (int *i = pBegin2;i <= pEnd2;i++)
        {
            if(*pMax < *i)
                pMax = i;
        }
        Reverse(pBegin2,pMax);            //内部翻转
        pBegin2++;
    }
    Reverse(pOrigB2,pOrigE2);                //写到外面 实现大翻转 区别

    INT64 totalTime2 = (GetTickCount() – startTime2);

    

    cout<<“\n\nThe running time is:”<<totalTime2<<endl;

    //for (int i = 0;i < num;i++)
        //printf(” %d “,cake2[i]);

Developing2:

///////////////////程序之美 1.3 算法实现///////我的算法//////////////////////////////////
//为改进
    ///*
    //算法描述:首先找出数组中pBegin和pEnd最大的数,进行翻转 将最大数翻转到顶 在翻转至最下层
    //*/

    int *pBegin,*pEnd;
    
    pBegin = &cake1[0];
    pEnd = &cake1[num – 1];
    const int *pOrigB = &cake1[0];
    const int *pOrigE = &cake1[num – 1];

    INT64 startTime = GetTickCount();
    int *pMax = NULL;

    while (pEnd != pOrigB)
    {
        int *pMax1 = pBegin;
        int *pMax2 = pEnd;
        for (int *i = pBegin,*j = pEnd;i <= j;i++,j–)//双指针 双向搜索最大值
        {
            if(*pMax1 < *i)
                pMax1 = i;
            if (*pMax2 < *j)
                pMax2 = j;
        }
        pMax = *pMax1<*pMax2?pMax2:pMax1;
        Reverse(pBegin,pMax);
        Reverse(pBegin,pEnd);                    //这个比较糟糕 翻转次数过多度 感觉
        pEnd–;
    }

    INT64 totalTime = (GetTickCount() – startTime);

    cout<<“The running time is:”<<totalTime<<endl;

    //for (int i = 0;i < num;i++)
        //printf(” %d “,cake1[i]);


微软实现:

    原文作者:quarkleopard
    原文地址: https://blog.csdn.net/quarkleopard/article/details/7361130
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞