题目:输入一个整数数组,实现一个函数调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数的相对位置不变。
思路:这个题的解法有好多种,我在这里实现了两种解法。
1.快速排序的思想。
ps:关于快速排序的思想,我会在后面的博客中专门介绍各大排序。
int a[]={3,5,4,2,7,8,1,6}; int n=sizeof(a)/sizeof(a[0]); //插入排序的思想 O(n^2) for(size_t index=1;index<n;++index) { if(a[index]%2==1) //奇数 { int pos=index; while(pos>=0&&a[pos-1]%2==0) { int tmp=a[pos]; a[pos]=a[pos-1]; a[pos-1]=tmp; --pos; } } } 2.创建两个vector的对象,v1保存数组中的奇数,v2保存数组的偶数。
调用v1中的push_back()函数,从头开始遍历,使数组中的奇数依次尾插到v1中,在这个过程中,奇数之间的相对位置是保持不变的。v2也是类似的。最后先把v1中的值放到数组中,最后在放v2.
vector<int> v1; //存放奇数 vector<int> v2; //存放偶数 for(size_t i=0;i<n;++i) { if(a[i]%2==1) v1.push_back (a[i]); else v2.push_back (a[i]); } for(size_t i=0;i<v1.size();++i) { a[i]=v1[i]; } for(size_t j=0;j<v2.size();++j) { a[v1.size()+j]=v2[j]; } for(size_t i=0;i<n;++i) { cout<<a[i]<<" "; //3 5 7 1 4 2 8 6 } cout<<endl;