实验六 指针 程序片段编程题 1. 数组奇偶排列

数组奇偶排列

【问题描述】
从键盘输入n个整数,将奇数调整到前半部分,将偶数调整到后半部分,并分别按从小到大的顺序排列后输出。

【输入形式】
输入为两行,第一行为一个整数n(0

【输出形式】
输出为一行,为经过排列之后的n个整数。

【样例输入】
6
12 17 6 11 2 3

【样例输出】
3 11 17 2 6 12

#include  
void  qsort(int  arr[],  int  low,  int  high);
void  Swap(int  *a,  int  *b);
void  arrange(int  a[],  int  n);
using  namespace  std;

int  main()
{
     
        int  n;
        cin>>n;
      
int* a=new int[n];
                                                                                              /*  生成数组a  */
        for(int  i=0;  i<n;  i++)
        {
     
                cin>>a[i];
        }
      
 arrange(a,n);
                                                                                                  /*  函数调用  */
        for(int  i=0;  i<n;  i++)
                cout<<a[i]<<"  ";

        return  0;
}

void  arrange(int  a[],  int  n)
{
     
        int  *p=a,  *q=a+n-1;                                    /*  指针p指向数组的第一个元素,  指针q指向数组的最后一个元素  */

        while(p<q)                                                              /*  指针p从左向右寻找第一个偶数,  指针q从右向左寻找第一个奇数,将p、q所指向的元素进行交换,然后指针p、q相向移动  */
        {
     
                
while(*p%2==1){
          
                p++;
            }
while(*q%2==0){
     
                q--;
            }
if(p<q){
     
swap(*p,*q);
p++;
q--;
}


        }

        int  m;
        if  (p==q)
                m=*p%2?(p-a):(p-a-1);
        else
                m=q-a;

        qsort(a,0,m);                                                      /*  调用快速排序对奇数部分排序    */
        qsort(a,m+1,n-1);                                        /*  调用快速排序对偶数部分排序    */

}

void  qsort(int  *p,  int  low,  int  high)
{
     
        if  (high<=low)  return;
        int  key=p[low];
        int  i=low,  j=high+1;
        while(1)
        {
     
                while(p[++i]  <  key)
                {
     
                        if  (i==high)  break;
                }
                while(p[--j]  >  key)
                {
     
                        if  (j==low)  break;
                }
                if  (i>=j)  break;
                Swap(&p[i],  &p[j]);
        }

        Swap(&p[low],  &p[j]);
        qsort(p,  low,  j-1);
        qsort(p,  j+1,  high);
}

void  Swap(int  *a,  int  *b)
{
     
        int  temp=*a;
        *a=*b;
        *b=temp;
}

总结:
总是有三个数据过不了,调试发现调换奇偶的结果没有错,快速排序就乱了。
而快速排序是题上本来给的代码。
后来发现是这一串代码:

void  arrange(int  a[],  int  n)
{
     
        int  *p=a,  *q=a+n-1;                                    /*  指针p指向数组的第一个元素,  指针q指向数组的最后一个元素  */

        while(p<q)                                                              /*  指针p从左向右寻找第一个偶数,  指针q从右向左寻找第一个奇数,将p、q所指向的元素进行交换,然后指针p、q相向移动  */
        {
     
                
while(*p%2==1){
          
                p++;
            }
while(*q%2==0){
     
                q--;
            }
if(p<q){
     
swap(*p,*q);
p++;
q--;
}


        }

        int  m;
        if  (p==q)
                m=*p%2?(p-a):(p-a-1);
        else
                m=q-a;

        qsort(a,0,m);                                                      /*  调用快速排序对奇数部分排序    */
        qsort(a,m+1,n-1);                                        /*  调用快速排序对偶数部分排序    */

}

其中的这一部分:

if(p<q){
     
swap(*p,*q);
p++;
q--;
}

p++和q–必须在if控制范围之内,才能保证不多移动,调用快排正确。

你可能感兴趣的:(自用总结,c++,c++)