【问题描述】
从键盘输入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。