题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
这道题花了我大半天的时间来完成。总结一下,大概分为两种算法。
第一种算法,就是新建数组。这又分为两种情况。(1)遍历两次,遍历时候直接把数组中的数据放入数组中。第一次遍历,先找到所有的奇数,把它们依次放入数组中。然后再遍历一遍,再把所有的偶数放进去,这样我们就能得到所有重排过的数组。这种方法的不足是遍历两遍,空间复杂度有些高。(2)仍然是新建数组,但这次我们只需要遍历一次。在遍历过程中遇到偶数,就存入新的数组中,并在原数组中删除该数。遇到奇数,不处理,指针继续后移。最后将新数组整体添加到原来数组后面即可。
第二种算法,利用我们了解的排序算法。同样分为两种情况。(1)类似于冒泡排序,我们遍历数组,将前偶后奇的数交换。这个没有具体验证。(2)类似于插入排序。我们利用两个指针,第一个指针从左向右搜索,找到第一个偶数,第二个指针从第一个指针的后一个开始搜索,找到第一个奇数,两个指针之间全部都是偶数,将【第一指针,第二指针-1】,整体后移,然后将第二个指针找到的奇数放入到原来第一指针位置,然后第一指针继续后移,直到第二指针查找到最后一个元素,循环结束。
第一种情况的1,2,以及第二种情况的2,本人都具体验证过,现附上代码如下。
#include<iostream> #include<vector> #include<iterator> using namespace std; void show(vector<int> &array) { for (auto i : array) cout << i << " "; cout << endl; } //方法1,遍历两次,先放奇数,再放偶数 void reOrderArray(vector<int> &array) { vector<int> result; if (array.size() == 0) cout << "The array is null" << endl; int num = array.size(); for (int i = 0; i < num; i++) { if (array[i] % 2 == 1) result.push_back(array[i]); } for (int i = 0; i < num; i++) { if (array[i] % 2 == 0) result.push_back(array[i]); } array = result; show(array); } //方法2:新建一个数组,遍历一遍数组,奇数不动,将偶数存入新数组中,并在原来数组中删除 // 最后将新数组加在原来数组后面 void reOrderArray1(vector<int> &array) { vector<int> temp; vector<int>::iterator ib = array.begin(); while (ib != array.end()) { if ((*ib) %2 == 0) { temp.push_back(*ib); ib = array.erase(ib); } else ib++; } vector<int>::iterator beg = temp.begin(); vector<int>::iterator end = temp.end(); for (; beg != end; beg++) { array.push_back(*beg); } show(array); } //方法3,类似插入排序。先找到第一个偶数,然后再找到第一个奇数,将这段范围值整体后移, // 将找到的第一个奇数放到第一个偶数的位置 void reOrderArray2(vector<int> &array) { if (array.size() == 0) cout << "The array is null"; int i = 0, j; int l = array.size(); while(i < l) { while (i < l && (array[i] % 2 == 1)) { i++; } j = i + 1; while (j < l && (array[j] % 2 == 0)) { j++; } if (j < l) { int temp = array[j]; for (int m = j - 1; m >= i; m--) { array[m + 1] = array[m]; } array[i++] = temp; } else break; } show(array); } int main() { vector<int> arr = { 1,2,3,4,5,6,7,8 }; // reOrderArray(arr); // reOrderArray1(arr); reOrderArray2(arr); system("pause"); return 0; }