首页 > 代码库 > 重新排列数组,使得负数后面跟着正数,O(1)的空间
重新排列数组,使得负数后面跟着正数,O(1)的空间
两种情况:可以打乱原始顺序;不可以打乱原始顺序
下面代码未测试,只是build了一下
1 /************************************************************************* 2 > File Name: RearrangeArray.cpp 3 > Author: zhoukang1991 4 > Mail: zhoukang199191@126.com 5 > Created Time: 2014年08月28日 星期四 21时50分54秒 6 ************************************************************************/ 7 8 #include <iostream> 9 #include <vector>10 #include <algorithm>11 using namespace std;12 13 //keep the original sequence14 //类似于插入排序,不过是从左到右处理每次找到不满组15 //条件的就往后寻找满足的,并且数组右移16 void rightrotate(vector<int> &arr,int outofplace,int cur){17 int tmp = arr[cur];18 for(int i = cur ; i > outofplace ; --i){19 arr[i] = arr[i-1];20 }21 arr[outofplace] = tmp;22 }23 24 void rearrangeArray_1(vector<int> &arr){25 int n = arr.size();26 int outofplace = -1;27 for(int i = 0 ; i < n ; ++i){28 if(outofplace >= 0){29 if(((arr[i] >= 0) && (arr[outofplace] < 0)) || ((arr[i]<0)&&(arr[outofplace]>=0))){30 rightrotate(arr,outofplace,i);31 if(i-outofplace > 2){32 outofplace = outofplace+2;33 }34 else{35 outofplace = -1;36 }37 }38 }39 if(outofplace == -1){40 if(((arr[i] >= 0)&&(!(i&0x01)))||((arr[i] < 0)&&(i & 0x01))){41 outofplace = i;42 }43 }44 }45 }46 47 //不需要保持原来顺序48 //类似于快速排序:两个指针从前往后开始遍历,不满足条件的就交换49 int check(int v,int id){50 if((v >= 0)&&(!(id & 0x01))){51 return 1;52 }53 else if((v < 0) && (!(id & 0x01))){54 return -1;55 }56 return 0;57 }58 void rearrange_2(vector<int> &arr){59 int n = arr.size();60 int left,right;61 while(left < n && right < n){62 for(;left < n ; ++left){63 if(check(arr[left],left) == 1){64 break;65 }66 }67 for(;right < n ; ++right){68 if(check(arr[right],right) == -1){69 break;70 }71 }72 swap(arr[left],arr[right]);73 left++;74 right++;75 }76 }77 78 int main(){79 return 0;80 }
重新排列数组,使得负数后面跟着正数,O(1)的空间
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。