调整数组顺序时奇数位于偶数前边
题目描述:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
算法描述:
我们需要两个指针,其中一个指向开始(begin),另一个指向最后(end),begin指针只向后移动,end只向前移动。这样我们的思想是:begin每次只找偶数就停止,end每次只找奇数,遇到奇数就停止,然后执行交换操作。然后重复上面的操作,直到begin指针超过了end指针结束。
其实这种思想可以用在很多地方,例如将正数和负数分开等,框架是一样的就是while循环里的条件不同;
算法实现:
1 #include<iostream> 2 using namespace std; 3 4 void reOrder(int *data, int length){ 5 if(data == NULL || length < 0){ 6 return; 7 } 8 9 int *begin = data; 10 int *end = data + length - 1; 11 12 while(begin < end){ 13 while((*begin & 0x1 )!= 0){ 14 begin++; 15 } 16 17 while((*end & 0x1) == 0){ 18 end--; 19 } 20 21 if(begin < end){ 22 int temp = *begin; 23 *begin = *end; 24 *end = temp; 25 } 26 } 27 } 28 29 int main(){ 30 int str[] = {1, 2, 3, 4, 5, 6, 7, 8}; 31 int len = sizeof(str) / sizeof(int); 32 33 reOrder(str, len); 34 for(int i = 0; i < len; ++i){ 35 cout<<str[i]<<' '; 36 } 37 38 return 0; 39 }
参考书籍:
《剑指offer》