大饼的排序

来源:互联网 发布:ubuntu查看samba用户 编辑:程序博客网 时间:2024/04/28 23:41

来源于编程之美的一摞烙饼的排序。2种实现思路:
1. 从底层开始排序
2. 从上面开始排序
从上面排序分三种情况,不翻转,翻转一次,翻转3次(最开始以为是2次●0●)。这样看第一种最优,但是第二种是首先想到的方法,所以也进行了实现。菜鸟很菜的一个程序,写出来安慰一下自己:我有做过(一种悲伤的气氛)。
下面是完整的算法,其中run()是第二种,runbottom是第一种。

class Solution{public:    Solution()    {        pi_num=0;        rev_num=0;        flag=true;    }    ~Solution()    {        if (pi_Arry!=NULL)        {            delete pi_Arry;        }    }    void revert(int a,int b)//将在a~b之间的元素进行反转,包含a,b    {    //  assert(a<b);        int i,j;        i=a;        j=b;        if (i<j)        {            rev_num++;        }        for (;i<j;i++,j--)        {            int temp=0;            temp=pi_Arry[i];            pi_Arry[i]=pi_Arry[j];            pi_Arry[j]=temp;        }    }    int set_pie_Arry( int *in_pieArry,int in_pinum )//将元素保存在类的元素数组    {        if (in_pieArry==NULL||in_pinum<=0)        {            return 0;        }        pi_Arry=new int[in_pinum];        for (int a=0;a<in_pinum;a++)        {            pi_Arry[a]=in_pieArry[a];        }        pi_num=in_pinum;        putout();        return 1;    }    void putout()//将排序好的数组输出    {        cout<<"The sorted num are:";        for (int i=0;i<pi_num;i++)        {            cout<<pi_Arry[i]<<' ';        }        cout<<endl;        cout<<"the reverse num is:"<<rev_num;        //getchar();    }    void run()//从上到下的排序    {        for (int i=2;i<pi_num;i++)        {            if (pi_Arry[i-1]>=pi_Arry[0])//首先判断已排好顺序的元素的排序方向            {                flag=true;            }            else                flag=false;            if ((pi_Arry[i]>=pi_Arry[i-1]&&flag==true)||(pi_Arry[i]<=pi_Arry[i-1]&&flag==false))//不需要反转            {                continue;            }            else if ((pi_Arry[i]<=pi_Arry[0]&&flag==true)||(pi_Arry[i]>=pi_Arry[0]&&flag==false))//翻转1次            {                revert(0,i-1);            }            else if ((pi_Arry[0]<pi_Arry[i]&&pi_Arry[i]<pi_Arry[i-1]&&flag==true)||(pi_Arry[0]>pi_Arry[i]&&pi_Arry[i]>pi_Arry[i-1]&&flag==false))//翻转3次            {                revert(0,i);                int temp=0;                if (flag==true)                {                    for (temp=2;temp<i;temp++)                    {                        if (pi_Arry[temp]<=pi_Arry[0])                        {                            break;                        }                    }                }                else                {                    for (temp=2;temp<i;temp++)                    {                        if (pi_Arry[temp]>=pi_Arry[0])                        {                            break;                        }                    }                }                revert(0,temp-1);                revert(0,temp-2);            }        }        if (pi_Arry[pi_num-1]<=pi_Arry[0])        {            revert(0,pi_num-1);        }    }    void runbottom()//从下往上(方便书写是从上往下,最后进行一次翻转)    {        int bigarr=0;        int bignum=0;        for (int i=0;i<pi_num;i++)        {            bigarr=pi_Arry[i];            bignum=i;            for (int j=i+1;j<pi_num;j++)            {                if (bigarr<pi_Arry[j])//找到最大次大的进行排序翻转,最多2次                {                    bigarr=pi_Arry[j];                    bignum=j;                }            }            if (bignum!=i)            {                revert(bignum,pi_num-1);                revert(i,pi_num-1);            }        }    }    private:        int *pi_Arry;//保存的元素数组        int pi_num;//元素的个数        int rev_num;//翻转的次数        bool flag;//从上排序时,上面饼子的顺序,如果上面到下面是从小到大则flag=true,否则flag=false}最后进行测试int main(void){    int num[150];    int a;   cin>>a;    int i=0;    int j=a;    while(j)    {        cin>>num[i];        i++;        j--;    }    Solution numbers;    numbers.set_pie_Arry(num,a);    numbers.run();    numbers.putout();}
0 0
原创粉丝点击