// reverse.cpp : 定义控制台应用程序的入口点。
//解决烙饼翻转问题
//假设有N块大小不一的烙饼,那至少要翻几次,才能达到有序效果
#include "stdafx.h"
#include "iostream"
#include "windows.h"
using namespace std;
#define COUNT 10
int NInputNumber[COUNT] = { 2,5,4,3,1,10,7,6,9,8},
NTempBegin = 0,
NTempEnd = 9,
NBegin = 0,
NEnd = 9;
int nPosition;//最大值所在位置
void ShowArray(void);
void InitSort();//排序主函数
BOOL CheckSort(int CBegin,int CEnd);
//检查是否排好序
int FindTheMax(int nFBegin,int nFEnd);
//返回最大元素所在位置
void Reverse(int nRBegin,int nREnd);
//翻转一次
int _tmain(int argc, _TCHAR* argv[])
{
cout << "The original array is:" << endl;
ShowArray();
cout << "The whole process of ordering:" << endl;
InitSort();
while(1);
return 0;
}
//返回最大元素所在位置
int FindTheMax(int nFBegin,int nFEnd)
{
int NFTemp = NInputNumber[nFBegin];
int j = nFBegin;
for(int i = nFBegin;i <= nFEnd; i++)
{
if( NFTemp < NInputNumber[i] ){
NFTemp = NInputNumber[i];
j = i;
}
}
return j;
}
//翻转一次
void Reverse(int nRBegin,int nREnd)
{
int NRTemp;
for (int i = nRBegin,j = nREnd;i < j;i++,j--)
{
NRTemp = NInputNumber[i];
NInputNumber[i] = NInputNumber[j];
NInputNumber[j] = NRTemp;
}
ShowArray();//翻转一次就打印一次
}
//检查是否排好序了,排好就返回TRUE
BOOL CheckSort(int nCBegin,int nCEnd)
{
for(int i = nCBegin;i<nCEnd;i++)
{
if(NInputNumber[i] < NInputNumber[i+1])
{
}
else return FALSE;
}
return TRUE;
}
//打印数组
void ShowArray(void)
{
for (int i = 0;i < COUNT;i++)
{
cout<<NInputNumber[i]<<" ";
}
cout<<endl;
}
//排序主函数
void InitSort()
{
while(!CheckSort(0,COUNT-1)){
//退出循环的条件是已经排好序,每次都要检查一次,这里是个缺点,需要优化一下
nPosition = FindTheMax(NTempBegin,NTempEnd);//找到最大值所在位置
if (nPosition == NTempBegin){ //如果最大值在最上面,直接翻转一次
Reverse(NBegin,NEnd);
}
else if (nPosition == NEnd){ //如果最大值在最底下,那么向上移一层
NEnd -= 1;
NTempEnd = NEnd;
}
else
Reverse(NTempBegin,nPosition);
}
}