题目描述(剑指offer原版)
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。
分析:两个指针,p指向头,q指向尾,p向后遍历到偶数,q向前遍历到奇数,交换值,继续++p,--q直到p<q不成立。考虑到
扩展性,可以把判断奇偶的功能封装成返回bool的函数,作为参数传入排序函数中。
#include <stdio.h>
#include <iostream>
//判断函数,本题中为判断是不是奇数
bool judge(int a)
{
return (a & 1);
}
//使奇数位于前半部分,偶数位于后半部分
void reorderArray(int *array, unsigned int length, bool (*func)(int))
{
if (array == NULL || length <= 1) return;
int *p = array; //头指针
int *q = array + length - 1; //尾指针
while (p < q)
{
//p自增直到p指向偶数
while (p < q && !func(*p))
++p;
//q自减直到q指向奇数
while (p < q && func(*q))
--q;
//奇偶交换
if (p < q)
{
int temp = *p;
*p = *q;
*q = temp;
}
}
}
void printArray(int *a, unsigned int length)
{
if (a == NULL || length == 0) return;
for (unsigned int i = 0; i < length; ++i)
{
printf("%d ", a[i]);
}
printf("\n");
}
int main()
{
int a[] = {1,2,3,4,5,6,7,8,9,10};
printArray(a, 10);
reorderArray(a, 10, judge); //judge作为参数传入
printArray(a, 10);
getchar();
return 0;
}
题目描述(牛客网)
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的
相对位置不变
。(也就是说“稳定排序”)
class Solution {
public:
void reOrderArray(vector<int> &array) {
int length = array.size();
if(length == 0) return;
vector<int> a;
vector<int> b;
for(int i = 0; i < length; ++i)
{
if(array[i] & 1)
a.push_back(array[i]);
else
b.push_back(array[i]);
}
int count = 0;
for(auto e : a)
{
array[count++] = e;
}
for(auto e : b)
{
array[count++] = e;
}
}
};
解法二:STL algorithm.h sort 排序思想,由于要求相对位置不变,因此采用stable_sort稳定排序
class Solution {
public:
void reOrderArray(vector<int> &array) {
stable_sort(array.begin(), array.end(), compare);
}
static bool compare(int a, int b)
{
if((a & 1) == 1 && (b & 1) == 0)
return true;
else
return false;
}
};