haccks
haccks

Reputation: 106012

Error in function for Selection-Sort

My code for selection-sort

#include <stdio.h>

void selection_sort(int a[], int n);

int main()
{
    int size;

    printf("Enter the size of array: ");
    scanf("%d",&size);

    int b[size],i = 0;
    printf("Enter %d integers to be sorted: ",size);
    while(i++ < size)
        scanf("%d",&b[i]);
    selection_sort(b, size);

    printf("Sorted integers(by selection sort) are: ");
    for(int i = 0; i < size; i++)
          printf("%d",b[i]);

    return 0;       
}

void selection_sort(int a[], int n)
{   
    while(n >= 0 )
    {
        if(n == 0)
            break;
        else
        {
            int i = 0, c = 0;
            int largest = a[0];
            while(i++ < n)
                if(largest < a[i])
                {
                    c = i ;
                    largest = a[i];
                }
            int temp = a[--n];
            a[n] = largest;
            a[c] = temp;
            selection_sort(a, n);
       } 

    }

}

on sorting the array in ascending order

3    4    1    2

is giving weird output

2293388    4    3    0

I checked this many time but failed to remove the problem. What should I do to work it properly?
Algorithm used :
1. search for largest element in the array.
2. Move largest element to the last position of array.
3. Call itself recursively to sort the first n -1 element of the array.

Please don't give any other solution otherwise I will get confused.

Upvotes: 0

Views: 436

Answers (2)

d01berg
d01berg

Reputation: 66

EDIT

Ah, I see what goes wrong. First of all, while (i++ < n) does not do exactly what you expect it to do. It checks if the condition i < n is true, then it increments i. However, it seems that after the conditional check, i is already incremented in the body. So for example,

while (i++ < n)
   printf ("%d ", i);

will print out (with n=4):

1 2 3 4

So you first need to change that. Secondly, the outer while-loop is not at all necessary. Using one loop will suffice. Again, change the while loop in here to while (i < n) and increment i in the body. SO the final code will be:

#include <stdio.h>

void selection_sort(int a[], int n);

int main()
{
    int size;

    printf("Enter the size of array: ");
    scanf("%d", &size);

    int b[size], i = 0;
    printf("Enter %d integers to be sorted: ", size);
    while(i < size) {
        scanf("%d", &b[i]);
        i++;
    }

    selection_sort(b, size);

    printf("Sorted integers(by selection sort) are: ");
    i = 0;
    for(i = 0; i < size; i++)
          printf("%d ", b[i]);

    printf ("\n");
    return 0;       
}

void selection_sort(int a[], int n)
{   
    if(n == 0)
        return;
    else
    {
        int i = 0, c = 0;
        int largest = a[0];
        while(i < n) {
            if(largest < a[i])
            {
                c = i;
                largest = a[i];
            }
            i++;
        }

        int temp = a[--n];
        a[n] = a[c];
        a[c] = temp;
        selection_sort(a, n);
    } 
}

I tested this with your given input (3 4 1 2) and it prints out a sorted list: 1 2 3 4.

Upvotes: 1

Bibhu Mohapatra
Bibhu Mohapatra

Reputation: 17

Whenever you see such weird big numbers, its usually an array out of bounds issue. Please take a small data-set, say 5-6 numbers, and walk through your program. I am sure you can fix it. Good luck!!

Upvotes: 1

Related Questions