# Sorting Arrays - Even and Odd Input

Show 80 post(s) from this thread on one page
Page 1 of 2 12 Last
• 11-19-2003
deedlit
Sorting Arrays - Even and Odd Input
I was wondering if I am on the right track with this one.

I have to sort even and odd input numbers of an array, placing the even numbers at the front of the array, and the odd at the end.

Code:

``` for (iCntr = 0; iCntr < DIM; iCntr++) {       printf("%d > ", iCntr);       fscanf(stdin, "%d", &iInput[iCntr]); } for (iCntr = 0; iCntr < DIM; iCntr++) {     if (iCntr % 2)         iOdd = iCntr;     else         iEven = iCntr;     } } for (iOdd < DIM; iOdd++) {        printf(" %d \n", iInput[iOdd]);    } for (iEven < DIM; iEven++) {            printf(" %d \n", iInput[iEven]);    }```

Does this look even remotely correct to anyone?
I know the printf part isn't because I keep getting errors, but I have to work more on that.

• 11-19-2003
Prelude
>I have to sort even and odd input numbers of an array, placing the even numbers at the front of the array, and the odd at the end.
Code:

```#include <stdio.h> #include <stdlib.h> int eo ( const void *a, const void *b ) {   int ia = *(int *)a;   int ib = *(int *)b;   if ( ia % 2 == 0 && ib % 2 != 0 )     return -1;   else if ( ia % 2 != 0 && ib % 2 == 0 )     return +1;   else     return 0; } int main ( void ) {   int a[] = {1,2,3,4,5,6,7,8,9,0};   int i;   for ( i = 0; i < 10; i++ )     printf ( "%d ", a[i] );   printf ( "\n" );   qsort ( a, 10, sizeof ( int ), eo );   for ( i = 0; i < 10; i++ )     printf ( "%d ", a[i] );   printf ( "\n" );   return 0; }```
Replace qsort with your favorite sorting algorithm if you aren't familiar with it or aren't allowed to use it.
• 11-19-2003
linuxdude
is DIM the sizeof the array or the number of elements in the array or what?

for speed you could do this
Code:

```    if (iCntr & 1 == 0) /*the number is even*/         iOdd = iCntr;     else         iEven = iCntr;```
and why do you have the } at the end of the statement here
Code:

```for (iCntr = 0; iCntr < DIM; iCntr++) {     if (iCntr % 2)         iOdd = iCntr;     else         iEven = iCntr;     } }```
• 11-19-2003
deedlit

I probably had a typo; I didn't copy and paste but retyped.

Thanks for the help, I understand more now.
• 11-19-2003
jim mcnamara
Prelude's code shortend up a little
Code:

```#include <stdio.h> #include <stdlib.h> #define DIM 10 int comp(void *, void *); int main(int argc, char *argv[]){     int iInput[DIM];     int iCntr=0;     for (iCntr = 0; iCntr < DIM; iCntr++) {           printf("%d > ", iCntr);           fscanf(stdin, "%d", &iInput[iCntr]);     }     qsort(iInput,DIM,sizeof(int),comp);     for (iCntr = 0; iCntr < DIM; iCntr++) {           printf("%d \n", iInput[iCntr]);     }     return 0; } int comp(void *a,void *b){     return *(int *)a%2 - *(int *)b%2; }```
• 11-19-2003
deedlit
I'm new to the qsort function also. Is it just a shortcut that I probably haven't read about in my intro book yet?

Also, my book has void main() everywhere and I noticed you had
Code:

`int comp (void *, void *);`
and also a return value. do I just place my variables where you have the asterisk?

Sorry if I am a little slow...haha.
• 11-19-2003
Prelude
>Is it just a shortcut that I probably haven't read about in my intro book yet?
qsort is a function in the standard library. Since sorting is such a common operation, it makes sense to have a generic function do it for you instead of having to continually roll your own. That way we don't have to write and debug complex sorting algorithms all the time.

>Also, my book has void main() everywhere
Code:

`int main ( void )`
>do I just place my variables where you have the asterisk?
The asterisks are telling you that the variables will be pointers. In function prototypes you can omit the variable names, but they must be there in the definition, as shown by:
Code:

```int comp(void *a,void *b){     return *(int *)a%2 - *(int *)b%2; }```
• 11-19-2003
glUser3f
sounds like you haven't learned about function yet, so here goes a basic explanation:
in small programs all the code may go in main, but when your program grows, you may find yourself repeating pieces of code over and over, and the idea of functions comes in, a function is a piece of code you define once, and then you may call it whenever you like in you code, example:
Code:

```int add(int x, int y) {     return x + y; } void main() {     int apples = 3, oranges = 7;     int count = add(apples, oranges);     cout << cout; // output is 10 }```
when you call "add(apples, oranges);" code in add function executes, giving x the value of apples, and y the value of oranges, then add returns x+y which is assigned to cout.
qsort is a function, give an array to sort, and a sort function, it sorts the array, may sound a bit advance for now, more info:
http://cppreference.com/stdother_details.html#qsort
• 11-19-2003
Dave_Sinkula
Code:

```int comp(void *a,void *b){     return *(int *)a%2 - *(int *)b%2; }```
This does not return the correct value when there is integer overflow. The prototype of a function used with qsort should have const pointers.
Code:

`int comp(const void *a, const void *b);`
• 11-19-2003
deedlit
Thanks for the link, it helped explain the qsort function.

I am still a little confused about the pointers though. When I typed in the code, it said that I had a redeclaration of 'comp' previously declared at (my program.c).

What does that mean?

Also, when I execute it, it does not let me enter ten integers. It just says return value -1 and press any key to continue.

It could be because the redeclaration error won't let it compile properly though. I am not sure.
• 11-19-2003
jim mcnamara
Dave is correct about const void * - that is the prototype in stdlib.h :D
• 11-19-2003
deedlit
What kind of function is comp? It says something about a redeclaration of comp as int at line 5 as an error??

Code:

```#include <stdio.h> #include <stdlib.h> #define DIM 10 int comp(void *, void *); int main(int argc, char *argv[]){     int iInput[DIM]; int iCntr=0;         for (iCntr = 0; iCntr < DIM; iCntr++) {           printf("%d > ", iCntr);           fscanf(stdin, "%d", &iInput[iCntr]);     }     qsort(iInput,DIM,sizeof(int),comp);     for (iCntr = 0; iCntr < DIM; iCntr++) {           printf("%d \n", iInput[iCntr]);     }     return 0;     }   int comp(const void *a,const void *b) {     return *(int *)a%2 - *(int *)b%2; }```
(I also haven't learned about pointers, again, apologies for my slowness)
• 11-19-2003
viaxd
> What kind of function is comp? It says something about a redeclaration of comp as int at line 5 as an error??
just change the prototype at line 5 to :
int comp(const void *a,const void *b);
• 11-19-2003
deedlit
Geez, now I feel stupid
:o

Thank you very much for your help.
• 11-19-2003
deedlit
Is it possible to add something to this program to make it so the latter half, the odd numbers, are also in the same order they began in at the end of the array?

Ex:

before: 1428754744
after: 4284441757

Thanks
Show 80 post(s) from this thread on one page
Page 1 of 2 12 Last