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