I have to read a csv file and then sort its data basen on the dates in ascending order. The plot twist is that the 90% of the data is sorted correctly but the other 10% is not. The dates in the csv file are written in this form 01/17/2015(month/day/year). I tested the code a bit and i noticed that if i run insertion sort twice then the 10% of the data that were not sorted, are perfectly sorted. My question is why is this happening, is it a problem with my code or with this algorithm. The fact that it runs properly for the most part and if i run it aggain it sorts the file perfectly makes me think that the only problem is with the algorithm and not my code.
#include <stdio.h>
typedef struct
{
int month;
int day;
int year;
float T_degC;
float PO4uM;
float SiO3uM;
float NO2uM;
float NO3uM;
float Salnty;
float O2ml_L;
} hello;
int insertionSort(hello hellos[], int records);
int main()
{
FILE* file;
file = fopen("ocean1.csv", "r");
if (file == NULL)
{
printf("Error opening file. \n");
return 1;
}
hello hellos[1405];
int read = 0;
int records = 0; // dhladh struct
do
{
read = fscanf(file,
"%d/%d/%d, %f, %f, %f, %f, %f, %f, %f",
&hellos[records].month,
&hellos[records].day,
&hellos[records].year,
&hellos[records].T_degC,
&hellos[records].PO4uM,
&hellos[records].SiO3uM,
&hellos[records].NO2uM,
&hellos[records].NO3uM,
&hellos[records].Salnty,
&hellos[records].O2ml_L);
if (read == 10)
{
records++;
}
if (read != 10 && feof(file) == 0)
{
printf("File format incorrect.\n");
return 1;
}
if (ferror(file))
{
printf("Error reading file.\n");
return 1;
}
} while (!feof(file));
fclose(file);
printf("\n%d records read.\n\n", records);
insertionSort(hellos, records);
// insertionSort(hellos, records);
//Εκτυπωση των αποτελεσματων.
for (int i = 0; i < records; i++)
{
printf("\n%d, %d, %d, %f, %f, %f, %f, %f, %f, %f",
hellos[i].month,
hellos[i].day,
hellos[i].year,
hellos[i].T_degC,
hellos[i].PO4uM,
hellos[i].SiO3uM,
hellos[i].NO2uM,
hellos[i].NO3uM,
hellos[i].Salnty,
hellos[i].O2ml_L);
printf("\n");
}
return 0;
}
int insertionSort(hello hellos[], int records)
{
int i;
hello key;
for (int j = 1; j < records; j++)
{
key = hellos[j];
i = j - 1;
printf("\n\n%d", i);
// printf("\n%d", key.month);
// printf("\n%d", hellos[i].month);
if (key.year < hellos[i].year)
{
// printf("\nmpla");
while (i >= 0 && key.year < hellos[i].year)
{
hellos[i + 1] = hellos[i];
i = i - 1;
}
hellos[i + 1] = key;
}
else if (key.year == hellos[i].year)
{
// printf("\nmpla2");
if (key.month < hellos[i].month)
{
// printf("\nmpla3");
while (i >= 0 && key.month < hellos[i].month && key.year == hellos[i].year)
{
hellos[i + 1] = hellos[i];
i = i - 1;
}
hellos[i + 1] = key;
}
else if (key.month == hellos[i].month)
{
// printf("\nmpla4");
if (key.day < hellos[i].day)
{
// printf("\nmpla5");
while (i >= 0 && key.day < hellos[i].day && key.month == hellos[i].month)
{
hellos[i + 1] = hellos[i];
i = i - 1;
}
hellos[i + 1] = key;
}
else if (key.day == hellos[i].day)
{
// printf("\nmpla6");
if (key.T_degC < hellos[i].T_degC)
{
// printf("\nmpla7");
while (i >= 0 && key.day == hellos[i].day && key.month == hellos[i].month &&
key.year == hellos[i].year)
{
hellos[i + 1] = hellos[i];
i = i - 1;
}
hellos[i + 1] = key;
}
}
}
}
}
return 0;
}
Here are some examples of data from my csv:
02/02/2015,20.37,0.22,0,0,0,33.685,5.5
02/01/2015,17.71,0.28,0.5,0,0,33.676,5.93
01/30/2015,10.85,1.32,16.5,0.05,14.8,33.752,4.19
01/31/2015,10.54,1.85,27.4,0.02,21.5,33.881,2.75
01/29/2015,10.49,1.98,30,0.02,22.6,33.946,2.41
01/28/2015,10.39,2.03,30.7,0.02,23,33.96,2.37
01/27/2015,10.22,2.1,31.8,0.02,23.6,33.982,2.31
01/26/2015,9.75,2.19,34.7,0.01,24.8,34.029,2.39
01/25/2015,18.43,0.11,1,0,0,33.464,5.83
01/24/2015,18.25,0.04,2,0,0,33.452,5.95
01/22/2015,15.6,0.19,3.8,0.04,0.7,33.423,5.91
01/23/2015,12.7,0.41,6,0.1,1.4,33.393,5.88
01/21/2015,10.98,1.09,16.6,0.07,14.1,33.481,4.04
01/20/2015,10.93,1.55,23.8,0.04,19.1,33.531,2.82
01/19/2015,10.74,1.67,26.7,0.04,20.7,33.583,2.55
01/16/2015,10.27,1.66,27.8,0.01,21.2,33.636,2.71
01/15/2015,10.02,1.76,34.4,0.03,24.3,33.747,2.11
01/17/2015,20.22,0.15,1,0,0,33.654,5.34
01/18/2015,20.22,0.15,1,0,0,33.654,5.34