数组:奇数在前,偶数在后,要求顺序不变

不要求顺序:http://zhedahht.blog.163.com/blog/static/25411174200741295930898/

要求顺序:http://blog.sina.com.cn/s/blog_5163a02d0101b6u6.html


1.不要求顺序

一个数组,如[3,5,2,4,6,8,9,32,1],有奇数有偶数,要求把所有奇数放在前面,偶数放在后面。思路是做两个指针或下标,第一个从左边开始遍历,遇到偶数就停下,第二个从右边开始遍历,遇到奇数就停下。交换两个元素,继续遍历,直到相遇。

gen.c:生成测试用的随机数。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fp=fopen("in.txt","wt");
    int i;
    fprintf(fp,"%d\n",10);
    for(i=0;i<10;i++)
    {
        int n=5+rand()%20;
        int j;
        fprintf(fp, "%d", n);
        for(j=0; j<n; j++)
        {
            int t=rand()%100;
            fprintf(fp," %d", t);
            
        }
        fprintf(fp,"\n");
        
    }
    
    fclose(fp);
    return 0;
}
gcc gen.c -o gen

生成格式:

3   #三个用例

3 1 2 3  #长度为3

4 1 2 3 4  #长度为4

5 1 2 3 4 5

odd.c:实现算法

#include <stdio.h>
#include <stdlib.h>

int isodd(int x);
void resort(int *p, int n);

int main()
{
    int n;
    int n0;
    scanf("%d", &n);
    n0=n;
    while(n0--)
    {
        int len;
        int *p;
        int i;
        
        scanf("%d", &len);        
        p=(int*)malloc(sizeof(int) * len);
        
        //input
        for(i=0; i<len; i++)
        {
            scanf("%d", p+i);
        }
        
        //do
        resort(p, len);
        //output
        for(i=0; i<len; i++)
            printf("%d ", p[i]);
        printf("\n");
        
        free(p);
    }
    return 0;
}

int isodd(int x)
{
    return (x&1);
}

void resort(int *p, int n)
{
    int index1=0,index2=n-1;
    while(index1<index2)
    {
        int tmp;
        while(isodd (p[index1]) && index1<n)index1++;
        while(!isodd (p[index2]) && index2>=0)index2--;
        if(index1>=index2)
            break;
        tmp=p[index1];
        p[index1]=p[index2];
        p[index2]=tmp;
    }
}

administrator@ubuntu:~/tel$ gcc odd.c -o odd
administrator@ubuntu:~/tel$ ./odd <in.txt 
49 77 15 93 35 86 92 86 
63 27 59 90 62 26 
11 72 36 26 68 
29 69 29 35 23 67 62 30 2 22 58 82 
93 37 11 19 29 73 21 42 84 56 98 24 
13 13 29 91 5 27 73 25 5 81 96 70 62 84 56 36 80 46 26 70 
99 95 51 45 3 67 87 43 64 50 34 8 76 78 88 84 14 82 54 24 32 60 
1 39 17 97 1 67 39 95 70 34 78 94 86 26 2 12 92 52 56 68 80 
41 65 89 71 19 97 29 31 17 40 44 
75 9 27 67 97 56 
administrator@ubuntu:~/tel$ 

2.要求顺序

#include <stdio.h>
#include <stdlib.h>

int isodd(int x);
void resort(int *p, int n);

void swap(int *p, int begin, int end);
void swap2(int *p, int begin, int mid, int end);

int main()
{
    int n;
    int n0;
    scanf("%d", &n);
    n0=n;
    while(n0--)
    {
        int len;
        int *p;
        int i;
        
        scanf("%d", &len);        
        p=(int*)malloc(sizeof(int) * len);
        
        //input
        for(i=0; i<len; i++)
        {
            scanf("%d", p+i);
        }
        
        //do
        resort(p, len);
        //output
        for(i=0; i<len; i++)
            printf("%d ", p[i]);
        printf("\n");
        
        free(p);
    }
    return 0;
}

int isodd(int x)
{
    return (x&1);
}

void resort(int *p, int n)
{
    int ep; //偶数块的下标
    int op; //奇数块的下标
    int end; //结束
    
    int i=0;
    
    while(i<n)
    {
        for(;i<n && isodd(p[i]); i++);  // 找到ep
        if(i>=n)
            break;
        ep=i;
        
        for(;i<n && !isodd(p[i]); i++);  // 找到op
        if(i>=n)
            break;
        op=i;
        
        for(;i<n && isodd(p[i]); i++);  // 找到end
        end=i;
        
        swap2(p, ep, op, end);
        i = ep+end-op;
        
    }
}

// begin ~ end-1
void swap(int *p, int begin, int end)
{
    int i,j;
    for(i=begin,j=end-1; i<j; i++,j--)
    {
        int t;
        t=p[i];
        p[i]=p[j];
        p[j]=t;
    }
}

// begin ~ mid-1
// mid ~ end-1
void swap2(int *p, int begin, int mid, int end)
{
    swap(p, begin, mid);
    swap(p, mid, end);
    swap(p, begin, end);
}

依然用上面的in.txt测试:

administrator@ubuntu:~/tel$ cat in.txt
10
8 86 77 15 93 35 86 92 49
6 62 27 90 59 63 26
5 26 72 36 11 68
12 29 82 30 62 23 67 35 29 2 22 58 69
12 93 56 11 42 29 73 21 19 84 37 98 24
20 70 13 26 91 80 56 73 62 70 96 81 5 25 84 27 36 5 46 29 13
22 24 95 82 45 14 67 34 64 43 50 87 8 76 78 88 84 3 51 54 99 32 60
21 68 39 12 26 86 94 39 95 70 34 78 67 1 97 2 17 92 52 56 1 80
11 41 65 89 44 19 40 29 31 17 97 71
6 75 9 27 67 56 97
administrator@ubuntu:~/tel$ gcc odd2.c -o odd2
administrator@ubuntu:~/tel$ ./odd2 <in.txt 
77 15 93 35 49 86 86 92 
27 59 63 62 90 26 
11 26 72 36 68 
29 23 67 35 29 69 82 30 62 2 22 58 
93 11 29 73 21 19 37 56 42 84 98 24 
13 91 73 81 5 25 27 5 29 13 70 26 80 56 62 70 96 84 36 46 
95 45 67 43 87 3 51 99 24 82 14 34 64 50 8 76 78 88 84 54 32 60 
39 39 95 67 1 97 17 1 68 12 26 86 94 70 34 78 2 92 52 56 80 
41 65 89 19 29 31 17 97 71 44 40 
75 9 27 67 97 56 

第一个数组8个元素:
86 77 15 93 35 86 92 49
以此类推。但是复杂度是不是O(n)呢???




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值