调整数组顺序时奇数位于偶数前边

题目描述:

  输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

 

算法描述

  我们需要两个指针,其中一个指向开始(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》

posted @ 2016-03-28 19:39  Dormant  阅读(205)  评论(0编辑  收藏  举报