标签:
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分
思路:
声明两个指针,一个指向该数组的头,另一个指向该数组的尾,将头指针指向的第一个偶数和尾指针指向的第一个奇数交换即可,直到头指针大于尾指针跳出循环。
代码如下:
void tiaozheng(int *data,unsigned int length) { if(data==NULL||length<=0) throw exception("参数错误!"); int *begin=data; int *end=data+length-1; //将begin的第一个偶数和end的第一个奇数交换,直到begin>=end,这时所有奇数都在偶数前面 while(begin<end) { //begin指向的数为奇数则begin++,是偶数则跳出循环 while(begin<end && (*begin & 0x1)==1) begin++; //end指向的数为偶数则end++,是奇数数则跳出循环 while(begin<end && (*end & 0x1)==0) end--; //如果begin<end则交换这两个数字 if(begin<end) { int temp=*begin; *begin=*end; *end=temp; } } }
上面的方法只能用于区分奇数和偶数,程序的通用性不高,例如如果需要将正数和负数分开则需要重新写一个函数,下面是一个用于解决此类问题的通用模板,如果需要划分正负数的话,将函数的参数func更改为判断正负数的函数即可。(本例中传入判断奇偶数的方法isjishu)
代码如下:
//判断是否是奇数的函数,奇数返回true,偶数返回false bool isjishu(int x) { if(x & 0x1==1) return true; else if(x & 0x1==0) return false; } //打印函数 void print(int *data,int length) { int *begin=data; int count=0; while(count<length) { cout<<*begin<<" "; begin++; count++; } cout<<endl; } //使用通用的模板解决此类问题 void tiaozheng2(int *data,unsigned int length,bool (*func)(int)) { if(data==NULL||length<=0) throw exception("参数错误!"); int *begin=data; int *end=data+length-1; //将begin的第一个偶数和end的第一个奇数交换,直到begin>=end,这时所有奇数都在偶数前面 while(begin<end) { //begin指向的数为奇数则begin++,是偶数则跳出循环 while(begin<end && func(*begin)) begin++; //end指向的数为偶数则end++,是奇数数则跳出循环 while(begin<end && !func(*end)) end--; //如果begin<end则交换这两个数字 if(begin<end) { int temp=*begin; *begin=*end; *end=temp; } } }
测试代码及运行结果:
int main() { int data[5]={1,2,3,4,5}; print(data,5); tiaozheng2(data,5,isjishu); print(data,5); return 0; }
标签:
原文地址:http://www.cnblogs.com/runninglzw/p/4522561.html