#include #include void longestSub(int* ARRAY,int ARRAY_LENGTH, int** RESULT,int* RESULT_LENGTH){ //RESULT and RESULT_LENGTH will be modified by their pointers if(ARRAY_LENGTH <= 1){ *RESULT=ARRAY; *RESULT_LENGTH = ARRAY_LENGTH; } else{ int PIVOT = ARRAY[0]; int *LONGEST_SUB = NULL; int i, j, LONGEST_SUB_LENGTH = 0; int TEMPORARY_ARRAY_LENGTH = 0, *TEMPORARY_ARRAY = NULL; for(i = 1; i < ARRAY_LENGTH; i++){ if (ARRAY[i] < PIVOT){ TEMPORARY_ARRAY_LENGTH = 0; TEMPORARY_ARRAY = NULL; for(j = i+1;j < ARRAY_LENGTH; j++){ if(ARRAY[j] >= ARRAY[i]){ TEMPORARY_ARRAY_LENGTH++; TEMPORARY_ARRAY = (int *)realloc(TEMPORARY_ARRAY, TEMPORARY_ARRAY_LENGTH*sizeof(int)); TEMPORARY_ARRAY[TEMPORARY_ARRAY_LENGTH-1] = ARRAY[j]; } } longestSub(TEMPORARY_ARRAY, TEMPORARY_ARRAY_LENGTH, &TEMPORARY_ARRAY, &TEMPORARY_ARRAY_LENGTH); if(LONGEST_SUB_LENGTH < TEMPORARY_ARRAY_LENGTH + 1){ LONGEST_SUB_LENGTH = TEMPORARY_ARRAY_LENGTH + 1; LONGEST_SUB = (int *)realloc(LONGEST_SUB, LONGEST_SUB_LENGTH*sizeof(int)); LONGEST_SUB[0] = ARRAY[i]; for(i = 1;i < LONGEST_SUB_LENGTH; i++) LONGEST_SUB[i] = TEMPORARY_ARRAY[i-1]; } } } TEMPORARY_ARRAY = NULL; TEMPORARY_ARRAY_LENGTH = 0; for(i = 1;i < ARRAY_LENGTH; i++){ if(ARRAY[i] >= PIVOT){ TEMPORARY_ARRAY_LENGTH++; TEMPORARY_ARRAY = (int *)realloc(TEMPORARY_ARRAY, TEMPORARY_ARRAY_LENGTH*sizeof(int)); TEMPORARY_ARRAY[TEMPORARY_ARRAY_LENGTH-1] = ARRAY[i]; } } longestSub(TEMPORARY_ARRAY, TEMPORARY_ARRAY_LENGTH, &TEMPORARY_ARRAY, &TEMPORARY_ARRAY_LENGTH); if(TEMPORARY_ARRAY_LENGTH + 1 > LONGEST_SUB_LENGTH){ LONGEST_SUB_LENGTH = TEMPORARY_ARRAY_LENGTH + 1; LONGEST_SUB = (int *)realloc(LONGEST_SUB, LONGEST_SUB_LENGTH*sizeof(int)); LONGEST_SUB[0] = PIVOT; for(i = 1;i < LONGEST_SUB_LENGTH; i++) LONGEST_SUB[i] = TEMPORARY_ARRAY[i-1]; } *RESULT = LONGEST_SUB; *RESULT_LENGTH = LONGEST_SUB_LENGTH; } } int main(){ int EXAMPLE_LENGTH = 8; int EXAMPLE[] = {18, 2, 15, 4, 30, 0, 11, 12}; int *RESULT = NULL; int RESULT_LENGTH, i; longestSub(EXAMPLE, EXAMPLE_LENGTH, &RESULT, &RESULT_LENGTH); printf("Longest Sub Sequence length: %d and it's:\n", RESULT_LENGTH); for(i = 0;i < RESULT_LENGTH; i++) printf("%d ",RESULT[i]); printf("\n"); return 0; }