"ritchie" <ri*********@yahoo.com> wrote in message
news:3b**************************@posting.google.c om...
Hi,
I am writing to ask if anyone can see why my array is not being sorted
correctly?
It's an array of 4 elements(ints 1,2,3,4) but after calling the
selection sort
it comes back sorted as 1,1,2,4.
I have narrowed it down to the sort function. I'm almost positive
that the error lies within sort?
Yes it does. See below.
I have included the full program.
Any ideas?
Thanks in advance,
Ritchie.
*******************start code****************************
#include<stdio.h>
#include <stdlib.h> /* MKW */
#define MAX 4
void sort(int [], int ); //sort function
main()
{
int iArr[MAX] = {1,2,3,4}; //original array
int iTmpArr[MAX]; // tmp array...for copying
// int iMenuChoice = 0;
int i;
//copy iArr to iTmpArr
for(i=0;i<MAX;i++)
{
iTmpArr[i] = iArr[i];
}
sort(iTmpArr, MAX); //call selection sort
}
void sort( int iTmpArr[], int iMax)
{
int i, iSmallestElement, iSortElement, iTemp;
printf("\n****************Selection Sort****************\n");
for( iSortElement=0; iSortElement <iMax-1; iSortElement++ )
{
iSmallestElement = iSortElement;
for( i=iSortElement +1; i <= iMax; i++ )
{
if( iTmpArr[ i ] < iTmpArr[ iSmallestElement ] )
iSmallestElement = i;
if( iSmallestElement != iSortElement )
{
iTemp = iTmpArr[ iSmallestElement ];
iTmpArr[ iSmallestElement ] = iTmpArr[ iSortElement ];
iTmpArr[ iSortElement ] = iTemp;
}
}
}
printf("Sorted array\n");
for(i=0; i<iMax;i++)
printf("%d ", iTmpArr[i]);
printf("\n");
}
***********************end of code*************************
The standard response to a query such as yours is "watch it
with a debugger." If you don't have, or can't or won't use
one, you can still do rudimentary debugging by outputting
values of pertinent variables at strategic locations in the code.
Here is your code with such output statements included, which
is what I used to watch your variables, and thus locate the
problem (all my changes/additions are marked with /* MKW */) :
(also your code was not indented, I don't know if this was
intentional or if your newsreader mangled it, I used indentation
to make the code more readable -- a GREAT aid for debugging).
#include <stdio.h>
#define MAX 4
void sort(int [], int ); //sort function
int main(void) /* MKW fixed return type */
{
/* int iArr[MAX] = {1,2,3,4}; //original array */ /* MKW removed */
/* MKW make original nonsorted */
int iArr[MAX] = {4,3,2,1}; /* MKW */
int iTmpArr[MAX]; // tmp array...for copying
// int iMenuChoice = 0;
int i;
//copy iArr to iTmpArr
for(i=0;i<MAX;i++)
{
iTmpArr[i] = iArr[i];
}
sort(iTmpArr, MAX); //call selection sort
return 0; /* MKW main() must return an int */
}
void show_array(int *array, size_t elems) /* MKW */
{
size_t i = 0; /* MKW */
puts("array contents:"); /* MKW */
for(i = 0; i < elems; ++i) /* MKW */
printf("array[%d] == %d\n", i, array[i]); /* MKW */
putchar('\n'); /* MKW */
}
void sort( int iTmpArr[], int iMax)
{
int i, iSmallestElement, iSortElement, iTemp;
iTemp = 0; /* MKW */
printf("\n****************Selection Sort****************\n");
for( iSortElement=0; iSortElement <iMax-1; iSortElement++ )
{
printf("iSortElement == %d\n", iSortElement); /* MKW */
iSmallestElement = iSortElement;
/* ******* HERE IS THE PROBLEM ****** */
/* for( i=iSortElement +1; i <= iMax; i++ ) /* /* MKW removed */
for( i=iSortElement +1; i < iMax; i++ ) /* MKW */
{
printf("i == %d\n", i); /* MKW */
printf("iSmallestElement == %d\n", /* MKW */
iSmallestElement); /* MKW */
printf("iTmpArr[%d] == %d\n", /* MKW */
i, /* MKW */
iTmpArr[i]); /* MKW */
printf("iTmpArr[%d] == %d\n", /* MKW */
iSmallestElement, /* MKW */
iTmpArr[iSmallestElement]); /* MKW */
printf("iTmpArr[%d] < iTmpArr[%d] == %s\n", /* MKW */
i, /* MKW */
iSmallestElement, /* MKW */
iTmpArr[i] < iTmpArr[iSmallestElement] /* MKW */
? "true" : "false"); /* MKW */
if( iTmpArr[ i ] < iTmpArr[ iSmallestElement ] )
iSmallestElement = i;
printf("iSmallestElement == %d\n", /* MKW */
iSmallestElement); /* MKW */
printf("iSortElement == %d\n", /* MKW */
iSortElement); /* MKW */
printf("iSmallestElement != iSortElement == %s\n", /* MKW */
iSmallestElement != iSortElement /* MKW */
? "true" : "false"); /* MKW */
if( iSmallestElement != iSortElement )
{
iTemp = iTmpArr[ iSmallestElement ];
iTmpArr[ iSmallestElement ] = iTmpArr[ iSortElement ];
iTmpArr[ iSortElement ] = iTemp;
}
printf("iSortElement == %d\n", iSortElement); /* MKW */
printf("iSmallestElement == %d\n", iSmallestElement); /* MKW
*/
printf("iTemp == %d\n", iTemp); /* MKW */
show_array(iTmpArr, iMax); /* MKW */
printf(("Press return")); /* MKW */
fflush(stdout); /* MKW */
getchar(); /* MKW */
putchar('\n'); /* MKW */
}
}
printf("Sorted array\n");
for(i=0; i<iMax;i++)
printf("%d ", iTmpArr[i]);
printf("\n");
}
Output (including debug output) after my fix:
****************Selection Sort****************
iSortElement == 0
i == 1
iSmallestElement == 0
iTmpArr[1] == 3
iTmpArr[0] == 4
iTmpArr[1] < iTmpArr[0] == true
iSmallestElement == 1
iSortElement == 0
iSmallestElement != iSortElement == true
iSortElement == 0
iSmallestElement == 1
iTemp == 3
array contents:
array[0] == 3
array[1] == 4
array[2] == 2
array[3] == 1
Press return
i == 2
iSmallestElement == 1
iTmpArr[2] == 2
iTmpArr[1] == 4
iTmpArr[2] < iTmpArr[1] == true
iSmallestElement == 2
iSortElement == 0
iSmallestElement != iSortElement == true
iSortElement == 0
iSmallestElement == 2
iTemp == 2
array contents:
array[0] == 2
array[1] == 4
array[2] == 3
array[3] == 1
Press return
i == 3
iSmallestElement == 2
iTmpArr[3] == 1
iTmpArr[2] == 3
iTmpArr[3] < iTmpArr[2] == true
iSmallestElement == 3
iSortElement == 0
iSmallestElement != iSortElement == true
iSortElement == 0
iSmallestElement == 3
iTemp == 1
array contents:
array[0] == 1
array[1] == 4
array[2] == 3
array[3] == 2
Press return
iSortElement == 1
i == 2
iSmallestElement == 1
iTmpArr[2] == 3
iTmpArr[1] == 4
iTmpArr[2] < iTmpArr[1] == true
iSmallestElement == 2
iSortElement == 1
iSmallestElement != iSortElement == true
iSortElement == 1
iSmallestElement == 2
iTemp == 3
array contents:
array[0] == 1
array[1] == 3
array[2] == 4
array[3] == 2
Press return
i == 3
iSmallestElement == 2
iTmpArr[3] == 2
iTmpArr[2] == 4
iTmpArr[3] < iTmpArr[2] == true
iSmallestElement == 3
iSortElement == 1
iSmallestElement != iSortElement == true
iSortElement == 1
iSmallestElement == 3
iTemp == 2
array contents:
array[0] == 1
array[1] == 2
array[2] == 4
array[3] == 3
Press return
iSortElement == 2
i == 3
iSmallestElement == 2
iTmpArr[3] == 3
iTmpArr[2] == 4
iTmpArr[3] < iTmpArr[2] == true
iSmallestElement == 3
iSortElement == 2
iSmallestElement != iSortElement == true
iSortElement == 2
iSmallestElement == 3
iTemp == 3
array contents:
array[0] == 1
array[1] == 2
array[2] == 3
array[3] == 4
Press return
Sorted array
1 2 3 4
I did not do any other testing of your sort, so it might or
might not be fully correct yet. I mainly wanted to show you
one way of tracking down a problem.
HTH,
-Mike