日期:2014-05-18  浏览次数:21197 次

求一个数据分组的算法
现在有一组数据 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 16

int 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;
}