练习六 指针程序片段编程题 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循环的内容)
    {
        if((*p%2==0)&&(*q%2==1))   //当满足条件时交换两数
            {int t=*p;*p=*q;*q=t;}  
        if(*p%2==1)
            p++;
        if(*q%2==0)
            q--;
    }
    int m;
    if(p==q)
        m=*p%2?(p-a):(p-a-1);   //这个地方意思是,当p为偶数时m=(p-a-1),当p为奇数时m=(p-a)
    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;
}

其中while(p<q)循环中还可以这样写

while(p<q)       
    {
        do
        {
            if(*p%2==0)
                break;
            else
                p++;
        }
        while(1);
        do
        {
            if(*q%2==1)
                break;
            else
                q++;
        }
        while(1);
        swap(p,q);
    }

要求填写的最后一个空,即快速排序的qsort(a,m+1,n-1),其中m+1是数组a排序后第一个偶数元素的下标,并且数组a共有n个元素,所以最后一个元素的下标是n-1。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值