数据结构-调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
分析:首先想到的是进行遍历,然后移到后面,但是效率O(n^2)。所以考虑使用首尾指针,可进行直接交换数据。但是这里考虑一下拓展性。
/* 剑指offer面试题14 */ #include <iostream> using namespace std; /* void ReorderOddEven(int* a,int low,int high){ if(a == NULL || high <= low){ return; } while(high > low){ while(a[low] & 1){ low++; } while(!(a[high] & 1)){ high--; } if(low - high == 1){ break; } int tmp = a[low]; a[low] = a[high]; a[high] = tmp; } } */ /* 上面注释的代码,为常规的实现方法。 下面是可拓展的代码。例如题目换成前半部是可以除于3或者是正数 这会只需要改下IsEven函数 */ bool IsEven(int n){ return (n & 1) == 0; } void ReOrder(int* a,int low,int high,bool (*func)(int)){ if(a == NULL || high <= low){ return; } while(high > low){ while(!func(a[low]) && high > low){ low++; } while(func(a[high]) && high > low){ high--; } if(low - high == 1){ break; } int tmp = a[low]; a[low] = a[high]; a[high] = tmp; } } void ReorderOddEven(int* a,int low,int high){ ReOrder(a,low,high,IsEven); } int main() { int a[] = {1,5,2,1,4,1,5,6,1,5,2,1}; int n = sizeof(a)/sizeof(*a); ReorderOddEven(a,0,n-1); for(int i=0;i<n;i++){ cout << a[i] << " "; } return 0; }