TheAlgorithms-C/misc/longest_subsequence.c

97 lines
3.1 KiB
C

#include <stdio.h>
#include <stdlib.h>
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;
}