使用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]);
微软实现: