两种情况:可以打乱原始顺序;不可以打乱原始顺序
下面代码未测试,只是build了一下
1 /************************************************************************* 2 > File Name: RearrangeArray.cpp 3 > Author: zhoukang1991 4 > Mail: [email protected] 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 sequence 14 //类似于插入排序,不过是从左到右处理每次找到不满组 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 }
时间: 2024-10-05 19:05:33