Home > Software design >  Selection sort not working as expected (C language)
Selection sort not working as expected (C language)

Time:01-30

I have to sort an array of structs with selection sort, after I read them from a file.txt. My algorithm is not working as expected, but it always avoid to sort them and it print the struct in decreasing order.

Example of file.txt :

P0 "ANTONIO" 2000 4
P1 "BARTOLOMEO" 1995 6
P2 "CARLO" 2020 1
P3 "DEMETRIO" 1960 2
P4 "ETTORE" 1920 3
P5 "FRANCESCO" 1950 5

Input: 2 5 3 1 6 4
Output: 4 6 1 3 5 2

What am I doing wrong?

Code below:

#include <stdio.h>
#include <stdlib.h>
#define N 7

struct persona
{
    char codice[10];
    char nome[30];
    int anno[10];
    int reddito[10];
};

int main()
{
    FILE* fp;
    fp = fopen("Testo.txt", "r");
    struct persona* persona = malloc(sizeof(struct persona) * N);
    int i = 0;
    int j = 0;

    if (fp != NULL)
    {
        while (i < N-1)
        {
            fscanf(fp, "%s %s %s %s",
                persona[i].codice,
                persona[i].nome,
                persona[i].anno,
                persona[i].reddito);
            i  ;
        }
    }
    else
    {
        perror("Errore");
    }
    fclose(fp);

    for(i=0; i<N-2; i  )
    {


        int min = persona[i].reddito;
        for(j=i 1; j<N-1; j  )
        {
            if(persona[j].reddito < persona[i].reddito)
            {
                min = persona[j].reddito;
            }
        persona[N] = persona[j];
        persona[j] = persona[i];
        persona[i] = persona[N];
        }

    }

    for(i=0; i<N-1;i  )
    {
    printf("%s\t %s\t %s\t %s\n",
        persona[i].codice,
        persona[i].nome,
        persona[i].anno,
        persona[i].reddito);

    }


}

CodePudding user response:

The statement to check sets only the min only if this statement is true

 if(persona[j].reddito < persona[i].reddito)

try using the qsort function

int cmpfunc (const void * a, const void * b) {
    struct persona *p1 = (struct persona *)a;
    struct persona *p2 = (struct persona *)b;

    if(p1->reddito < p2->reddito) return -1;
    if(p1->reddito > p2->reddito) return 1;
    return 0;
 }

and instead of the for loop, use qsort(persona, N, sizeof(struct persona), cmpfunc);

CodePudding user response:

You have 6 lines in the file, but you have defined N as 7. It should be updated to 6.

while (i < N-1)

You are reading the first N-2, that is, 5 lines from the file. The 6th line is not being read. Same goes for other loops in the code using N.

int anno[10];
int reddito[10];

You do not need integer array to read the numeric fields in file, an integer should suffice.

As mentioned by @WhozCraig in the comments, the selection sort algorithm is incorrect. Here's the updated code for reference:

#include <stdio.h>
#include <stdlib.h>
#define N 6

typedef struct persona
{
    char codice[10];
    char nome[30];
    int anno;
    int reddito;
} PERSONA;

int main()
{
    FILE *fp;
    if ((fp = fopen("file.txt", "r")) == NULL)
    {
        perror("\nFile not found");
        exit(1);
    }

    PERSONA *persona = malloc(sizeof(struct persona) * N);
    int i = 0, j;
    while (i < N)
    {   if (fscanf(fp, "%s %s %d %d", persona[i].codice, persona[i].nome, &persona[i].anno, &persona[i].reddito) == EOF) {
            break;
        }
        i  ;
    }
    fclose(fp);

    PERSONA temp;
    /* selection sort */
    for (i = 0; i < N - 1; i  )
    {
        int jMin = persona[i].reddito;

        for (j = i   1; j < N; j  )
        {
            if (persona[j].reddito < persona[jMin].reddito)
            {
                jMin = j;
            }
        }

        if (jMin != i)
        {
            temp = persona[i];
            persona[i] = persona[jMin];
            persona[jMin] = temp;
        }
    }

    for (i = 0; i < N; i  )
    {
        printf("\n%s\t %s\t %d\t %d", persona[i].codice, persona[i].nome, persona[i].anno, persona[i].reddito);
    }
}

Further improvements: You could also calculate the number of lines in the file in the code instead of relying on a hardcoded value N.

  •  Tags:  
  • Related