| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 871 人关注过本帖
标题:数组归并去重问题
只看楼主 加入收藏
执笔画江山
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:265
专家分:1010
注 册:2015-1-13
结帖率:100%
收藏
 问题点数:0 回复次数:11 
数组归并去重问题
程序代码:
void merge(int c[], int *nc,int a[],int na,int b[], int nb)
{
    int cursora = 0;
    int cursorb = 0;
    int cursorc = 0;
    while((cursora<na)&&(cursorb<nb))
    {
        if (a[cursora]<= b[cursorb])
        {
            c[cursorc++]=a[cursora++];
        }

        else
        {
            c[cursorc++]=b[cursorb++];
        }
    }
    while(cursora<na)
    {
        c[cursorc++]=a[cursora++];
    }
    while(cursorb<nb)
    {
        c[cursorc++]=b[cursorb++];
    }
    *nc = cursorc;
}

这是一个数组归并的算法,假如a[3] = {1,2,3}; b[4] = {1,3,5,7}; 则合并后的数组为c[7]={1,1,2,3,3,5,7};
现在我想在这个代码上稍微改动一下 ,让它归并去重,得到的新数组为 c[5]={1,2,3,5,7};
我当然可以单独设计个子函数,对归并后的c[]进行去重,但是我现在不想这么弄,我现在就想在这个归并函数里面加上这个去重。

求助怎么弄???
2015-04-05 12:41
执笔画江山
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:265
专家分:1010
注 册:2015-1-13
收藏
得分:0 
问题已解决。

授人以鱼,不如授人以渔
2015-04-05 14:36
外部三电铃
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:那一年
等 级:贵宾
威 望:57
帖 子:2012
专家分:7306
注 册:2007-12-17
收藏
得分:0 
怎么解决的是啊

那一年,苍井空还是处女
2015-04-05 14:59
执笔画江山
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:265
专家分:1010
注 册:2015-1-13
收藏
得分:0 
回复 3楼 外部三电铃
程序代码:
void Merge(int c[], int *nc,int a[],int na,int b[], int nb)
{
    int cursora = 0;
    int cursorb = 0;
    int cursorc = 0;
    while((cursora<na)&&(cursorb<nb))
    {
        if (a[cursora]< b[cursorb])//这里加上等号 注掉下面的else if 就是一个归并  不去重
        {
            c[cursorc++]=a[cursora++];
        }
        else if(a[cursora] = b[cursorb])
        {
            c[cursorc++]=a[cursora++];
       
            cursorb++;    //现在是去重合并。加上elseif 上面的<= 改为<  如果这里只有 cursorb++; cursora++; 那么就是将重复的直接删掉
        }
        else
        {
            c[cursorc++]=b[cursorb++];
        }
    }
    while(cursora<na)
    {
        c[cursorc++]=a[cursora++];
    }
    while(cursorb<nb)
    {
        c[cursorc++]=b[cursorb++];
    }
    *nc = cursorc;
}

改动的地方在我汉字注释的地方

授人以鱼,不如授人以渔
2015-04-05 15:16
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
以下是引用执笔画江山在2015-4-5 15:16:43的发言:

void Merge(int c[], int *nc,int a[],int na,int b[], int nb)
{
    int cursora = 0;
    int cursorb = 0;
    int cursorc = 0;
    while((cursora<na)&&(cursorb<nb))
    {
        if (a[cursora]< b[cursorb])//这里加上等号 注掉下面的else if 就是一个归并  不去重
        {
            c[cursorc++]=a[cursora++];
        }
        else if(a[cursora] = b[cursorb])
        {
            c[cursorc++]=a[cursora++];
      
            cursorb++;    //现在是去重合并。加上elseif 上面的<= 改为<  如果这里只有 cursorb++; cursora++; 那么就是将重复的直接删掉
        }
        else
        {
            c[cursorc++]=b[cursorb++];
        }
    }
    while(cursora<na)
    {
        c[cursorc++]=a[cursora++];
    }
    while(cursorb<nb)
    {
        c[cursorc++]=b[cursorb++];
    }
    *nc = cursorc;
}

改动的地方在我汉字注释的地方


就这样的代码也能解决问题??
我很是怀疑

还是帮你一把吧

程序代码:
#include <stdio.h>
#include <stdlib.h>

int merger_sort(int *a, int *x, int lenx, int *y, int leny) {
    int i, *pa = a, *px = x, *py = y;
    *pa = (*px < *py) ? *px++ : *py++;

    while(px < x + lenx && py < y + leny) {
        if(*pa != ((*px < *py) ? *px : *py))
            *++pa = (*px < *py) ? *px++ : *py++;

        else {
            if(*pa == *px) px++;

            if(*pa == *py) py++;
        }
    }

    pa++;

    if(px == x + lenx) {
        while(py < y + leny) {
            for(i = 0; i < pa - a; i++)
                if(a[i] == *py) break;

            if(i == pa - a) *pa++ = *py;

            py++;
        }

    } else {
        while(px < x + lenx) {
            for(i = 0; i < pa - a; i++)
                if(a[i] == *px) break;

            if(i == pa - a) *pa++ = *px;

            px++;
        }
    }

    return pa - a;
}

int main(void) {
    int i;
    int x[] = {-1, 0, 1, 2, 3, 3, 4, 5, 5, 6, 7, 8, 9, 9};
    int y[] = {-2, 0, 1, 2, 2, 3, 4, 5, 6, 6, 7};
    int lenx = sizeof(x) / sizeof(x[0]);
    int leny = sizeof(y) / sizeof(y[0]);
    int *a = malloc((lenx + leny) * sizeof(int));

    if(!a) exit(EXIT_FAILURE);

    for(i = 0; i < merger_sort(a, x, lenx, y, leny); i++)
        printf("%d ", a[i]);

    puts("");
    free(a);
    return 0;
}

Only the Code Tells the Truth             K.I.S.S
2015-04-05 15:58
执笔画江山
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:265
专家分:1010
注 册:2015-1-13
收藏
得分:0 
回复 5楼 longwu9t
提示: 该帖被管理员或版主屏蔽

授人以鱼,不如授人以渔
2015-04-05 16:15
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

Only the Code Tells the Truth             K.I.S.S
2015-04-05 16:25
执笔画江山
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:265
专家分:1010
注 册:2015-1-13
收藏
得分:0 
回复 7楼 longwu9t
提示: 该帖被管理员或版主屏蔽

授人以鱼,不如授人以渔
2015-04-05 16:27
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
你眼中的世界只是你的心境
你口中的话语就是你的修养

你只会喷人 不会自省
这也算是挨你多次恶语相向后
我对你的一点奉劝
其实按常理不告诉你这些
更合乎一般情理
让你糊涂一辈子不是更妙???

Only the Code Tells the Truth             K.I.S.S
2015-04-05 16:30
执笔画江山
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:265
专家分:1010
注 册:2015-1-13
收藏
得分:0 
回复 9楼 longwu9t
提示: 该帖被管理员或版主屏蔽

授人以鱼,不如授人以渔
2015-04-05 16:36
快速回复:数组归并去重问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018581 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved