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

数组奇偶排列

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

【输入形式】
输入为两行,第一行为一个整数n(0<n≤107),第二行为n个整数。

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

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

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

#include  <iostream>
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控制范围之内,才能保证不多移动,调用快排正确。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值