# 剑指Offer - 面试题21：调整数组顺序使奇数位于偶数前面

## 分析

### 暴力法

C

#include<stdio.h>
#include<assert.h>
//暴力法
void ReordeOddEven(int* pData, unsigned int length)
{
assert(NULL != pData);
assert(length > 0);
int i = 0;
int j = 0;
for(i = 0; i < length; i++)
{
if((pData[i] & 1) == 0)//&优先级低于==所以务必加括号，否则永远不成立
{
int tmp = pData[i];
for(j = i; j < length - 1; j++)
{
pData[j] = pData[j + 1];
}
pData[j] = tmp;
}
}
}
void Print(int* n, int length)
{
int i = 0;
for(i = 0; i < length; i++)
{
printf("%d ", n[i]);
}
printf("\n");
}
int main()
{
int n[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int length = sizeof(n) / sizeof(n[0]);
ReordeOddEven(n, length);
Print(n, length);
return 0;
}


### 双指针

C

#include<stdio.h>
#include<assert.h>
void swap(int* n , int i, int j)
{
int tmp = n[i];
n[i] = n[j];
n[j] = tmp;
}
void ReordeOddEven(int* pData, unsigned int length)
{
assert(NULL != pData);
assert(length > 0);
int start = 0;
int end = length - 1;
while(start < end)
{
while(start < end && (pData[start] & 1) == 1)//如果是奇数就一直找
{
start++;
}
while(start < end && (pData[end] & 1) == 0)//如果是偶数就一直找
{
end--;
}
if(start < end)
{
swap(pData, start, end);
}
}
}
void Print(int* n, int length)
{
int i = 0;
for(i = 0; i < length; i++)
{
printf("%d ", n[i]);
}
printf("\n");
}
int main()
{
int n[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int length = sizeof(n) / sizeof(n[0]);
ReordeOddEven(n, length);
Print(n, length);
return 0;
}


### 具有扩展性的双指针

C

#include<stdio.h>
#include<assert.h>
#include<stdbool.h>
bool func(int n)
{
return (n & 1) == 0;
}
void swap(int* n, int i, int j)
{
int tmp = n[i];
n[i] = n[j];
n[j] = tmp;
}
void ReordeOddEven(int* pData, unsigned int length)
{
assert(NULL != pData);
assert(length > 0);
int start = 0;
int end = length -1;
while(start < end)
{
while(start < end && func(pData[start])  == false)
{
start++;
}
while(start < end && func(pData[end]) == true)
{
end--;
}
if(start < end)
{
swap(pData, start, end);
}
}
}
void Print(int* n, int length)
{
int i = 0;
for(i = 0; i < length; i++)
{
printf("%d ", n[i]);
}
printf("\n");
}
int main()
{
int n[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int length = sizeof(n) / sizeof(n[0]);
ReordeOddEven(n, length);
Print(n, length);
return 0;
}


|
9天前
|

9 0
|
22天前
|

10 0
|
1月前
|

LeetCode 题目 80：删除排序数组中的重复项 II【算法面试高频题】
LeetCode 题目 80：删除排序数组中的重复项 II【算法面试高频题】
22 0
|
2月前
【一刷《剑指Offer》】面试题 23：从上往下打印二叉树
【一刷《剑指Offer》】面试题 23：从上往下打印二叉树
37 0
|
2月前
【一刷《剑指Offer》】面试题 22：栈的压入、弹出系列
【一刷《剑指Offer》】面试题 22：栈的压入、弹出系列
28 0
|
2月前
|

【一刷《剑指Offer》】面试题 21：包含 main 函数的栈
【一刷《剑指Offer》】面试题 21：包含 main 函数的栈
14 0
|
2月前
【一刷《剑指Offer》】面试题 20：顺时针打印矩阵
【一刷《剑指Offer》】面试题 20：顺时针打印矩阵
39 0
|
14天前
|

Java面试之SpringCloud篇
Java面试之SpringCloud篇
30 1
|
14天前
|

Java面试之redis篇
Java面试之redis篇
34 0
|
14天前
|
SQL 关系型数据库 MySQL
java面试之MySQL数据库篇
java面试之MySQL数据库篇
22 0