为什么要排序呢?用索引好像就可以了,当然这不是关键!

解决方案 »

  1.   

    我只排一次序,并不影响速度啊。或者输入是有序的,不排。也一样的慢。
    我想最多我也就需要几千个数。我也不期望n会有上万个。这几千个数排序很快啊。排完序也就相当于加了索引。我排序是为了使我之后的元素添加和组合删除合理。(在递归时,
    只要有最大数,则去除掉该组合)兄弟再帮俺想想吧。谢谢。
      

  2.   

    与你的速度差不多。n=36,m=6时,总数有1947794组。输出在控制台也要不少时间!
    int main(int argc, char* argv[])
    {
    printf("Hello World!\n"); static int nLen=36;//n
    static int nPickNum=6;//m
    int* pData=new int[nLen];//数据源。
    int* pPickData=new int[nPickNum];//选出的数在数据源中的位置。
        int nCount=1; for(int i=0;i<nLen;i++)
    pData[i]=i+1;

        
    printf("\n%d:",nCount++);
    for(int k=0;k<nPickNum;k++)
    {
       pPickData[k]=k;
       printf("%d,",pData[pPickData[k]]);   
    } int nPickPos=nPickNum-1;//在pPickData中当前要替换的数的位置。
    int nDataPos=nPickNum;//在pData中可成为替换数的位置。
    while(nPickPos>=0)
    {
    //i是在pData中可成为替换数的位置。
    for(i=nDataPos;i<nLen;i++)
    {
    pPickData[nPickPos]=i;
    printf("\n%d:",nCount++);
    for(k=0;k<nPickNum;k++)
           printf("%d,",pData[pPickData[k]]);   
    }
    nPickPos--;
    while(nPickPos>=0)
    {
    if(pPickData[nPickPos]<(nLen-nPickNum+nPickPos))
    {
    int nBegin=pPickData[nPickPos];
    for(int j=nPickPos;j<nPickNum;j++)
    pPickData[j]=nBegin+(j-nPickPos)+1;
    printf("\n%d:",nCount++);
    for(int k=0;k<nPickNum;k++)
    printf("%d,",pData[pPickData[k]]);
    nPickPos=nPickNum-1;
    nDataPos=pPickData[nPickPos]+1;
    break;
    }
    else
    nPickPos--;
    }
    }
    delete pData;
    delete pPickData;
    return 0;
    }