2n 长度数组,n个奇数,n个偶数,把奇数放在奇数位,偶数放在偶数位

来源:互联网 发布:淘宝套餐链接转换 编辑:程序博客网 时间:2024/04/29 20:11

1. 先将偶数放在前面,奇数放在后面,然后在交换 a[i] <--> a[2n - i]  for i=left+1 ~ n  共  2n + n/2

2. 找出奇数在偶数位 与 偶数在奇数位,然后交换 4*n


#include <stdio.h>#include <time.h>#include <stdlib.h>#define N 1000000void oddEven1(int a[],int left,int right){int i=left,j = right;int tmp = 0;while(i<j){while(i<=right && a[i] % 2 == 0)i++;while(j>=left && a[j] % 2 == 1)j--;if(i<j)tmp = a[i],a[i] = a[j], a[j] = tmp;}j = left + (right - left)/2;for(i=left+1;i <=j;i += 2)tmp = a[i],a[i] = a[right - i],a[right - i] = tmp;}void oddEven2(int a[], int left,int right){int i = left,j = right;int tmp = 0;while(i<=right){while(i<= right)if(i % 2 == 0 && a[i] % 2 ==1)break;elsei++;while(j>=left)if(j % 2 == 1 && a[j] % 2 == 0)break;elsej--;if(i<=right && j>= left)tmp = a[i],a[i] = a[j],a[j] = tmp;}}int main(){int a[N];int i=0;//srand((unsigned)time(NULL));for(i=0;i<N;i++)a[i] = i+1;oddEven1(a,0,N-1);/*for(i=0;i<N;i++)printf("%d ",a[i]);putchar('\n');*//*oddEven2(a,0,N-1);for(i=0;i<N;i++)printf("%d ",a[i]);putchar('\n');*/}


0 0
原创粉丝点击