#include <stdio.h>
#include <malloc.h>
int *number;
void SortOddBeforeEven(int *number,int n){
int left = 0,right = n-1;
//下标
int oIndex = 0,eIndex = 0;
//二分遍历
while(left < right){
//从左边直到第一个偶数
while(left < right && (number[left] % 2 != 0)){
left++;
}
//从右边直到第一个奇数
while(left < right && (number[right] % 2 == 0)){
right--;
}
//奇偶数交换
if(left < right){
int temp;
temp = number[left];
number[left] = number[right];
number[right] = temp;
}
}
}
int main()
{
int i,n;
while(scanf("%d",&n) != EOF){
number = (int *)malloc(sizeof(int)*n);
for(i = 0;i < n;i++){
scanf("%d",&number[i]);
}
SortOddBeforeEven(number,n);
for(i = 0;i < n;i++){
if(i == n-1){
printf("%d\n",number[i]);
}
else{
printf("%d ",number[i]);
}
}
}
return 0;
}
- 题目描述:
-
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 输入:
-
每个输入文件包含一组测试案例。
对于每个测试案例,第一行输入一个n,代表该数组中数字的个数。
接下来的一行输入n个整数。代表数组中的n个数。
- 输出:
-
对应每个测试案例,
输入一行n个数字,代表调整后的数组。注意,数字和数字之间用一个空格隔开,最后一个数字后面没有空格。
- 样例输入:
-
5 1 2 3 4 5
- 样例输出:
-
1 3 5 2 4
/*********************************
* 日期:2013-11-15
* 作者:SJF0115
* 题号: 题目1516:调整数组顺序使奇数位于偶数前面
* 来源:http://ac.jobdu.com/problem.php?pid=1516
* 结果:AC
* 来源:剑指Offer
* 总结:
**********************************/
#include <stdio.h>
#include <malloc.h>
int *number;
void SortOddBeforeEven(int *number,int n){
if(n <= 0 || number == NULL){
return;
}
int oIndex = 0,eIndex = 0,i;
int *odd,*even;
odd = (int *)malloc(sizeof(int)*n);
even = (int *)malloc(sizeof(int)*n);
//寻找奇偶数
for(i = 0;i < n;i++){
//奇数
if(number[i] & 0x1 != 0){
odd[oIndex++] = number[i];
}
//偶数
else{
even[eIndex++] = number[i];
}
}
//输出奇数
for(i = 0;i < oIndex;i++){
//只有奇数
if(i == oIndex - 1 && eIndex == 0){
printf("%d",odd[i]);
}
else{
printf("%d ",odd[i]);
}
}
//输出偶数
for(i = 0;i < eIndex;i++){
if(i != eIndex - 1){
printf("%d ",even[i]);
}
else{
printf("%d",even[i]);
}
}
printf("\n");
}
int main()
{
int i,n;
while(scanf("%d",&n) != EOF){
number = (int *)malloc(sizeof(int)*n);
for(i = 0;i < n;i++){
scanf("%d",&number[i]);
}
SortOddBeforeEven(number,n);
}
return 0;
}