Search code examples
csortingstructbubble-sort

C code bubble sorting sometimes does not give correct output


I am trying to sort numbers using the bubble sorting method. However, sometimes the output returns some incorrect answers.

Appreciate someone can help how to fix this issue. the C code and incorrect output as below

typedef struct
{
    char pname[2];
    int ptotime;
} data;

int main()
{
    int totalwait = 0;
    data name[] = {{'A', .ptotime = 4},
                   {'B', .ptotime = 6},
                   {'C', .ptotime = 3},
                   {'D', .ptotime = 7},
                   {'E', .ptotime = 2}};

    printf("Process Name\t Process Time \n");

    for (int j = 0; j < 5; j++)
    {
        printf("\t%s\t\t\t\t%d\n", name[j].pname, name[j].ptotime);
    }

    //Shortest job first (SJF) scheduling
    printf("\nShortest job first (SJF) scheduling \n");

    int swapped, temp;

    while (1)
    {
        swapped = 0;

        for (int x = 0; x < 5; x++)
        {
            if (name[x].ptotime >= name[x + 1].ptotime)
            {
                temp = name[x].ptotime;
                name[x].ptotime = name[x + 1].ptotime;
                name[x + 1].ptotime = temp;
                swapped = 1;
                char temp2[2];
                strcpy(temp2, name[x].pname);
                strcpy(name[x].pname, name[x + 1].pname);
                stpcpy(name[x + 1].pname, temp2);
            }
        }

        if (swapped == 0)
        {
            break;
        }
    }
    printf("Process Name\t Process Time \n");

    for (int j = 0; j < 5; j++)
    {
        printf("\t%s\t\t\t\t%d\n", name[j].pname, name[j].ptotime);
    }

    return 0;
}

Output

Process Name     Process Time
        A                               4
        B                               6
        C                               3
        D                               7
        E                               2

Shortest job first (SJF) scheduling
Process Name     Process Time
                                        0
        E                               2
        C                               3
        A                               4
        B                               6

Expected output

Process Name     Process Time
        A                               4
        B                               6
        C                               3
        D                               7
        E                               2

Shortest job first (SJF) scheduling
Process Name     Process Time
        E                               2
        C                               3
        A                               4
        B                               6
        D                               7

Solution

  • For starters do not use magic numbers as 5. Use named constants.

    The array name is initialized incorrectly. You are using character literals to initialize the data member pname of a character array type without enclosing character literals in braces.

    data name[] = {{'A', .ptotime = 4},
                    ^^^
    //...
    

    in this loop

        for (int x = 0; x < 5; x++)
        {
            if (name[x].ptotime >= name[x + 1].ptotime)
                                        ^^^^^
            //...
    

    there is an access beyond the array. So the program has undefined behavior.

    Use local variables as for example the variable swap in the shortest scope where they are used.

    To swap elements of the array name there is no need to swap each data member of each element of the array. You can swap whole objects.

    Here is a demonstrative program.

    #include <stdio.h>
    
    typedef struct
    {
        char pname[2];
        int ptotime;
    } data;
    
    
    int main( void ) 
    { 
        data name[] = 
        {
            { "A", .ptotime = 4 },
            { "B", .ptotime = 6 },
            { "C", .ptotime = 3 },
            { "D", .ptotime = 7 },
            { "E", .ptotime = 2 }
        };
        const size_t N = sizeof( name ) / sizeof( *name );
    
        printf("Process Name\t Process Time \n");
    
        for ( size_t i = 0; i < N; i++ ) 
        {
            printf( "\t%s\t\t\t\t%d\n", name[i].pname, name[i].ptotime );
        }
    
        putchar( '\n' );
    
        //Shortest job first (SJF) scheduling
    
        printf("\nShortest job first (SJF) scheduling \n");
    
        for ( int swapped = 1; swapped; )
        {
            swapped = 0;
    
            for ( int i = 1; i < N; i++ ) 
            {
                if ( name[i].ptotime < name[i-1].ptotime )
                {
                    data tmp = name[i];
                    name[i] = name[i-1];
                    name[i-1] = tmp;
    
                    swapped = 1;
                }
            }
        }
    
        printf("Process Name\t Process Time \n");
    
        for ( size_t i = 0; i < N; i++ ) 
        {
            printf( "\t%s\t\t\t\t%d\n", name[i].pname, name[i].ptotime );
        }
    
        return 0;
    }
    

    Its output is

    Process Name     Process Time 
        A               4
        B               6
        C               3
        D               7
        E               2
    
    
    Shortest job first (SJF) scheduling 
    Process Name     Process Time 
        E               2
        C               3
        A               4
        B               6
        D               7