首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

数据分组的算法

2012-01-06 
求一个数据分组的算法现在有一组数据 1,3,5,7,8,9,10,20,21,22,23,24,25,40,41,42 混在一起现在要将这组数

求一个数据分组的算法
现在有一组数据 1,3,5,7,8,9,10,20,21,22,23,24,25,40,41,42 混在一起

现在要将这组数据分成 

int[] Group1 = {1,3,5,7,9}
int[] Group2 = {20,21,22,23,24,25}
int[] Group3 = {40,41,42,43}

以上示例的实际数据是胃排序的,也是随机生成的一组数据,但一定可以按某种连续性分成一组或N组,这样的算法如何写?

[解决办法]
但一定可以按某种连续性分成一组或N组
---------------------
-_-#,“某种连续性”,连你自己都不清楚规则,让大家怎么帮你

先把你的规则明确了,没有明确的规则,没办法给出实现
[解决办法]
没怎么调试,大致就这样.
也许有bug,楼主自己改一下.

其实这个题思想和最长递减子序列那种题很想,解法也差不多.
只不过还要考虑一下回溯,所以有stack.

注释为伪码,因为我懒得再写quicksort和stack的源码.
不用stack会遗漏某些序列,但是你的示例输入不会有问题.

C/C++ code
#include <stdio.h>#include <stdlib.h>#define SIZE 16int main(){    int arr[SIZE]={ 1,3,5,7,8,9,10,20,21,22,23,24,25,40,41,42 };        //arr=qsort(arr);    int arrSub[SIZE-1];    for (int i=0;i<SIZE-1;i++)    {        arrSub[i]=arr[i+1]-arr[i];    }    bool firstElement=true;    int subSofar=0;    int sub=arrSub[0];        //stackJ stackSub    for (int j=1;j<SIZE-1;j++)    {        int curSub=arrSub[j];        if (curSub==sub)        {            if(firstElement)            {                printf("%d,%d,%d,",arr[j-1],arr[j],arr[j+1]);                firstElement=false;            }            else            {                printf("%d,",arr[j+1]);            }        }        else if(curSub<sub)        {            subSofar+=curSub;            if (subSofar==sub)            {                printf("%d,",arr[j+1]);                subSofar=0;            }            else if(subSofar>sub)            {                subSofar=0;                firstElement=true;                printf("\n");            }        }        else        {            if (curSub>=SIZE-1-j)            {                sub=arrSub[++j];            }            else            {                sub=curSub;                //stackJ.push(j);                //stackSub.push(arrSub[j+1]);            }            firstElement=true;            subSofar=0;            printf("\n");        }    //    if(j==SIZE-1)    //    {    //        j=stackJ.pop();    //        sub=stackSub.pop():        //}    }    system("pause");    return 0;} 

热点排行