数组奇偶排列
【问题描述】
从键盘输入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控制范围之内,才能保证不多移动,调用快排正确。