Velocity Reviews > C++ > I need help with a function that swaps array halves.

# I need help with a function that swaps array halves.

cheetahclaws@yahoo.com
Guest
Posts: n/a

 09-05-2007
I am trying to create a function that reverses the halves of an
integer array. For example. if the array contains 1,2,3,4 --- after it
has gone to the function I constructed, the array will look like
3,4,1,2. In the case the array contains an odd amount of elements e.g.
1,2,3,4,5, it will look like 4,5,3,1,2.

I have created such an array as followed:
==================================
for(i=0;i<=((size/2)-1);i++)
{
if(size%2 != 0)
{
t = a[i];
a[i] = a[(size/2)+i+1];
a[(size/2)+i+1] = t;
}
else
{
t = a[i];
a[i] = a[(size/2)+i];
a[(size/2)+i] = t;
}
}
==================================

NOW, the problem is I want to create a function that does the same
thing, but I want to use a Nested For loop to do it as such without
using IF statements to handle what to do when size is odd or not.

I came up with the following code:
==================================
void reverseHalves(int a[], int size)
{
int i, t, j=0;

for(i=0;i<=((size/2)-1);i++)
{
t = a[i];
a[i] = a[(size/2)+i+1];
a[(size/2)+i+1] = t;

for(j=(size-(size/2));j<=(size/2)-1;j++)
{
t = a[j];
a[j] = a[(size/2)+j-1];
a[(size/2)+j-1] = t;
}
}
==================================

The problem is the second nested-for-loop version I have come up with
doesn't work. It only works for odd numbers. When I enter an even
number, I always end up getting a -24214214 or something like that for
one of the numbers.

It alllllmost works. I have been at this for about three hours and
almost at the end of my rope. Can someone PLEASE FOR THE LOVE OF GOD
GIVE ME SOME HELP BEFORE I BLOW MY BRAINS OUT?!?!!

-Thanks for listen.

Jim Langston
Guest
Posts: n/a

 09-06-2007

<(E-Mail Removed)> wrote in message
news:(E-Mail Removed) ups.com...
>I am trying to create a function that reverses the halves of an
> integer array. For example. if the array contains 1,2,3,4 --- after it
> has gone to the function I constructed, the array will look like
> 3,4,1,2. In the case the array contains an odd amount of elements e.g.
> 1,2,3,4,5, it will look like 4,5,3,1,2.
>
> I have created such an array as followed:
> ==================================
> for(i=0;i<=((size/2)-1);i++)
> {
> if(size%2 != 0)
> {
> t = a[i];
> a[i] = a[(size/2)+i+1];
> a[(size/2)+i+1] = t;
> }
> else
> {
> t = a[i];
> a[i] = a[(size/2)+i];
> a[(size/2)+i] = t;
> }
> }
> ==================================
>
>
> NOW, the problem is I want to create a function that does the same
> thing, but I want to use a Nested For loop to do it as such without
> using IF statements to handle what to do when size is odd or not.
>
>
> I came up with the following code:
> ==================================
> void reverseHalves(int a[], int size)
> {
> int i, t, j=0;
>
> for(i=0;i<=((size/2)-1);i++)
> {
> t = a[i];
> a[i] = a[(size/2)+i+1];
> a[(size/2)+i+1] = t;
>
> for(j=(size-(size/2));j<=(size/2)-1;j++)
> {
> t = a[j];
> a[j] = a[(size/2)+j-1];
> a[(size/2)+j-1] = t;
> }
> }
> ==================================
>
>
> The problem is the second nested-for-loop version I have come up with
> doesn't work. It only works for odd numbers. When I enter an even
> number, I always end up getting a -24214214 or something like that for
> one of the numbers.
>
> It alllllmost works. I have been at this for about three hours and
> almost at the end of my rope. Can someone PLEASE FOR THE LOVE OF GOD
> GIVE ME SOME HELP BEFORE I BLOW MY BRAINS OUT?!?!!

This looks like homework, but you have shown a lot of effort. Look at this
code, although you'll have to fix one bug when the arrays are odd sized:

#include <iostream>

void reverseHalves(int a[], int size)
{
int half = size / 2;
bool odd = size % 2 == 1;

int j = half;
if ( odd )
j++;

for ( int i = 0; i < half; ++i )
{
std::swap( a[i], a[j++] );
}
}

int main()
{
int Array[] = { 1, 2, 3, 4, 5, 6 };
reverseHalves( Array, sizeof( Array ) / sizeof( Array[0] ) );
for ( int i = 0; i < sizeof( Array ) / sizeof( Array[0] ); ++i )
std::cout << Array[i] << " ";
std::cout << "\n";

int Array2[] = { 1, 2, 3, 4, 5, 6, 7 };
reverseHalves( Array2, sizeof( Array2 ) / sizeof( Array2[0] ) );
for ( int i = 0; i < sizeof( Array2 ) / sizeof( Array2[0] ); ++i )
std::cout << Array2[i] << " ";
std::cout << "\n";

}

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

The output is close to what you want except for odd, where the question
becomes... do you want
4567123
or
5671234

Fix the code to express what you want.

cheetahclaws@yahoo.com
Guest
Posts: n/a

 09-06-2007
On Sep 5, 8:19 pm, "Jim Langston" <(E-Mail Removed)> wrote:
> <(E-Mail Removed)> wrote in message
>
> news:(E-Mail Removed) ups.com...
>
>
>
> >I am trying to create a function that reverses the halves of an
> > integer array. For example. if the array contains 1,2,3,4 --- after it
> > has gone to the function I constructed, the array will look like
> > 3,4,1,2. In the case the array contains an odd amount of elements e.g.
> > 1,2,3,4,5, it will look like 4,5,3,1,2.

>
> > I have created such an array as followed:
> > ==================================
> > for(i=0;i<=((size/2)-1);i++)
> > {
> > if(size%2 != 0)
> > {
> > t = a[i];
> > a[i] = a[(size/2)+i+1];
> > a[(size/2)+i+1] = t;
> > }
> > else
> > {
> > t = a[i];
> > a[i] = a[(size/2)+i];
> > a[(size/2)+i] = t;
> > }
> > }
> > ==================================

>
> > NOW, the problem is I want to create a function that does the same
> > thing, but I want to use a Nested For loop to do it as such without
> > using IF statements to handle what to do when size is odd or not.

>
> > I came up with the following code:
> > ==================================
> > void reverseHalves(int a[], int size)
> > {
> > int i, t, j=0;

>
> > for(i=0;i<=((size/2)-1);i++)
> > {
> > t = a[i];
> > a[i] = a[(size/2)+i+1];
> > a[(size/2)+i+1] = t;

>
> > for(j=(size-(size/2));j<=(size/2)-1;j++)
> > {
> > t = a[j];
> > a[j] = a[(size/2)+j-1];
> > a[(size/2)+j-1] = t;
> > }
> > }
> > ==================================

>
> > The problem is the second nested-for-loop version I have come up with
> > doesn't work. It only works for odd numbers. When I enter an even
> > number, I always end up getting a -24214214 or something like that for
> > one of the numbers.

>
> > It alllllmost works. I have been at this for about three hours and
> > almost at the end of my rope. Can someone PLEASE FOR THE LOVE OF GOD
> > GIVE ME SOME HELP BEFORE I BLOW MY BRAINS OUT?!?!!

>
> This looks like homework, but you have shown a lot of effort. Look at this
> code, although you'll have to fix one bug when the arrays are odd sized:
>
> #include <iostream>
>
> void reverseHalves(int a[], int size)
> {
> int half = size / 2;
> bool odd = size % 2 == 1;
>
> int j = half;
> if ( odd )
> j++;
>
> for ( int i = 0; i < half; ++i )
> {
> std::swap( a[i], a[j++] );
> }
>
> }
>
> int main()
> {
> int Array[] = { 1, 2, 3, 4, 5, 6 };
> reverseHalves( Array, sizeof( Array ) / sizeof( Array[0] ) );
> for ( int i = 0; i < sizeof( Array ) / sizeof( Array[0] ); ++i )
> std::cout << Array[i] << " ";
> std::cout << "\n";
>
> int Array2[] = { 1, 2, 3, 4, 5, 6, 7 };
> reverseHalves( Array2, sizeof( Array2 ) / sizeof( Array2[0] ) );
> for ( int i = 0; i < sizeof( Array2 ) / sizeof( Array2[0] ); ++i )
> std::cout << Array2[i] << " ";
> std::cout << "\n";
>
> }
>
> Output:
> 4 5 6 1 2 3
> 5 6 7 4 1 2 3
>
> The output is close to what you want except for odd, where the question
> becomes... do you want
> 4567123
> or
> 5671234
>
> Fix the code to express what you want.

Thanks for the help. I'm starting to put together a picture of
something here. I was just wondering, how does the swap function work?
If I wanted to exclude it from the For-Loop and use something like:

t=a[i];
a[i] = a[j];
a[j] = t;
j++;

where t is a temporary variable, would that be the same?

Jerry Coffin
Guest
Posts: n/a

 09-06-2007
In article <(E-Mail Removed). com>,
http://www.velocityreviews.com/forums/(E-Mail Removed) says...
> I am trying to create a function that reverses the halves of an
> integer array. For example. if the array contains 1,2,3,4 --- after it
> has gone to the function I constructed, the array will look like
> 3,4,1,2. In the case the array contains an odd amount of elements e.g.
> 1,2,3,4,5, it will look like 4,5,3,1,2.

Already posted on c.l.c++.m, but since you seem a bit stressed and this
will get to you a bit sooner:

#include <algorithm>

void swap_halves(int *a, size_t size) {

int pivot = size/2;

std::swap_ranges(a, a+pivot, a+pivot+size%2);
}

--
Later,
Jerry.

The universe is a figment of its own imagination.

Phoenix
Guest
Posts: n/a

 09-06-2007
On 9 6 , 7 50 , (E-Mail Removed) wrote:
> I am trying to create a function that reverses the halves of an
> integer array. For example. if the array contains 1,2,3,4 --- after it
> has gone to the function I constructed, the array will look like
> 3,4,1,2. In the case the array contains an odd amount of elements e.g.
> 1,2,3,4,5, it will look like 4,5,3,1,2.
>
> I have created such an array as followed:
> ==================================
> for(i=0;i<=((size/2)-1);i++)
> {
> if(size%2 != 0)
> {
> t = a[i];
> a[i] = a[(size/2)+i+1];
> a[(size/2)+i+1] = t;
> }
> else
> {
> t = a[i];
> a[i] = a[(size/2)+i];
> a[(size/2)+i] = t;
> }
> }
> ==================================
>
> NOW, the problem is I want to create a function that does the same
> thing, but I want to use a Nested For loop to do it as such without
> using IF statements to handle what to do when size is odd or not.
>
> I came up with the following code:
> ==================================
> void reverseHalves(int a[], int size)
> {
> int i, t, j=0;
>
> for(i=0;i<=((size/2)-1);i++)
> {
> t = a[i];
> a[i] = a[(size/2)+i+1];
> a[(size/2)+i+1] = t;
>
> for(j=(size-(size/2));j<=(size/2)-1;j++)
> {
> t = a[j];
> a[j] = a[(size/2)+j-1];
> a[(size/2)+j-1] = t;
> }
> }
> ==================================
>
> The problem is the second nested-for-loop version I have come up with
> doesn't work. It only works for odd numbers. When I enter an even
> number, I always end up getting a -24214214 or something like that for
> one of the numbers.
>
> It alllllmost works. I have been at this for about three hours and
> almost at the end of my rope. Can someone PLEASE FOR THE LOVE OF GOD
> GIVE ME SOME HELP BEFORE I BLOW MY BRAINS OUT?!?!!
>
> -Thanks for listen.

I have a silly idea, what about to use a stack to make it? I think you
understand what I mean.

Jim Langston
Guest
Posts: n/a

 09-06-2007
<(E-Mail Removed)> wrote in message
news:(E-Mail Removed) ups.com...
> On Sep 5, 8:19 pm, "Jim Langston" <(E-Mail Removed)> wrote:
>> <(E-Mail Removed)> wrote in message
>>
>> news:(E-Mail Removed) ups.com...
>>
>>
>>
>> >I am trying to create a function that reverses the halves of an
>> > integer array. For example. if the array contains 1,2,3,4 --- after it
>> > has gone to the function I constructed, the array will look like
>> > 3,4,1,2. In the case the array contains an odd amount of elements e.g.
>> > 1,2,3,4,5, it will look like 4,5,3,1,2.

>>
>> > I have created such an array as followed:
>> > ==================================
>> > for(i=0;i<=((size/2)-1);i++)
>> > {
>> > if(size%2 != 0)
>> > {
>> > t = a[i];
>> > a[i] = a[(size/2)+i+1];
>> > a[(size/2)+i+1] = t;
>> > }
>> > else
>> > {
>> > t = a[i];
>> > a[i] = a[(size/2)+i];
>> > a[(size/2)+i] = t;
>> > }
>> > }
>> > ==================================

>>
>> > NOW, the problem is I want to create a function that does the same
>> > thing, but I want to use a Nested For loop to do it as such without
>> > using IF statements to handle what to do when size is odd or not.

>>
>> > I came up with the following code:
>> > ==================================
>> > void reverseHalves(int a[], int size)
>> > {
>> > int i, t, j=0;

>>
>> > for(i=0;i<=((size/2)-1);i++)
>> > {
>> > t = a[i];
>> > a[i] = a[(size/2)+i+1];
>> > a[(size/2)+i+1] = t;

>>
>> > for(j=(size-(size/2));j<=(size/2)-1;j++)
>> > {
>> > t = a[j];
>> > a[j] = a[(size/2)+j-1];
>> > a[(size/2)+j-1] = t;
>> > }
>> > }
>> > ==================================

>>
>> > The problem is the second nested-for-loop version I have come up with
>> > doesn't work. It only works for odd numbers. When I enter an even
>> > number, I always end up getting a -24214214 or something like that for
>> > one of the numbers.

>>
>> > It alllllmost works. I have been at this for about three hours and
>> > almost at the end of my rope. Can someone PLEASE FOR THE LOVE OF GOD
>> > GIVE ME SOME HELP BEFORE I BLOW MY BRAINS OUT?!?!!

>>
>> This looks like homework, but you have shown a lot of effort. Look at
>> this
>> code, although you'll have to fix one bug when the arrays are odd sized:
>>
>> #include <iostream>
>>
>> void reverseHalves(int a[], int size)
>> {
>> int half = size / 2;
>> bool odd = size % 2 == 1;
>>
>> int j = half;
>> if ( odd )
>> j++;
>>
>> for ( int i = 0; i < half; ++i )
>> {
>> std::swap( a[i], a[j++] );
>> }
>>
>> }
>>
>> int main()
>> {
>> int Array[] = { 1, 2, 3, 4, 5, 6 };
>> reverseHalves( Array, sizeof( Array ) / sizeof( Array[0] ) );
>> for ( int i = 0; i < sizeof( Array ) / sizeof( Array[0] ); ++i )
>> std::cout << Array[i] << " ";
>> std::cout << "\n";
>>
>> int Array2[] = { 1, 2, 3, 4, 5, 6, 7 };
>> reverseHalves( Array2, sizeof( Array2 ) / sizeof( Array2[0] ) );
>> for ( int i = 0; i < sizeof( Array2 ) / sizeof( Array2[0] ); ++i )
>> std::cout << Array2[i] << " ";
>> std::cout << "\n";
>>
>> }
>>
>> Output:
>> 4 5 6 1 2 3
>> 5 6 7 4 1 2 3
>>
>> The output is close to what you want except for odd, where the question
>> becomes... do you want
>> 4567123
>> or
>> 5671234
>>
>> Fix the code to express what you want.

>
>
>
> Thanks for the help. I'm starting to put together a picture of
> something here. I was just wondering, how does the swap function work?
> If I wanted to exclude it from the For-Loop and use something like:
>
> t=a[i];
> a[i] = a[j];
> a[j] = t;
> j++;
>
> where t is a temporary variable, would that be the same?

Yes. Swapping two variables is a very common programming in task, where you
save one variable to a temp, assign the other to it, then save the temp to
the second. It is so common, in fact, that it's in the stl. Realistically,
it's probably supposed to be std::swap and I'm not even sure what header
it's supposed to be in. Whichever header, apparently <iostream> includes
it.

James Kanze
Guest
Posts: n/a

 09-06-2007
On Sep 6, 3:03 am, Jerry Coffin <(E-Mail Removed)> wrote:
> In article <(E-Mail Removed). com>,
> (E-Mail Removed) says...

> > I am trying to create a function that reverses the halves of an
> > integer array. For example. if the array contains 1,2,3,4 --- after it
> > has gone to the function I constructed, the array will look like
> > 3,4,1,2. In the case the array contains an odd amount of elements e.g.
> > 1,2,3,4,5, it will look like 4,5,3,1,2.

> Already posted on c.l.c++.m, but since you seem a bit stressed and this
> will get to you a bit sooner:

> #include <algorithm>

> void swap_halves(int *a, size_t size) {
>
> int pivot = size/2;
>
> std::swap_ranges(a, a+pivot, a+pivot+size%2);
> }

Interesting. Yet another standard function which I didn't know
about. Using std::vector (of course), something like:

std::swap_ranges( v.begin(),
v.begin() + v.size() / 2,
v.end - v.size() / 2 ) ;

should do the trick.

My first reaction, not knowing of this function, was to ask why
he didn't use the classical solution:

std::reverse( v.begin(), v.end() ) ;
std::reverse( v.begin(), v.begin() + v.size() / 2 ) ;
std::reverse( v.end() - v.size() / 2, v.end() ) ;

And of course, std::rotate can also be used, although it would
require an extra test:

std::rotate( v.begin(), v.begin() + v.size() / 2, v.end() ) ;
if ( v.size() % 2 != 0 ) {
std::rotate( v.begin(), v.begin() + 1, v.end() - v.size() /
2 ) ;
}

--
James Kanze (GABI Software) email:(E-Mail Removed)
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Jerry Coffin
Guest
Posts: n/a

 09-06-2007
In article <(E-Mail Removed). com>,
(E-Mail Removed) says...
> On Sep 6, 3:03 am, Jerry Coffin <(E-Mail Removed)> wrote:

[ ... ]

> > std::swap_ranges(a, a+pivot, a+pivot+size%2);
> > }

>
> Interesting. Yet another standard function which I didn't know

Quite honestly, I didn't either until this came up. What I orginally
thought of (and was looking for) was whether there was a version of
remove that took a pair of iterators to specify what was to be removed.
It doesn't exist, but opening the reference for algorithm, I noticed
swap_ranges, which sounded quite promising...

> Using std::vector (of course), something like:
>
> std::swap_ranges( v.begin(),
> v.begin() + v.size() / 2,
> v.end - v.size() / 2 ) ;

You meant 'v.end()' of course.

> should do the trick.

Yup. Roughly the same idea would work here, using a+size-size/2 instead
of a+size+size%2 [or, equivalently, a+size+(size&1)].

> My first reaction, not knowing of this function, was to ask why
> he didn't use the classical solution:

[ ... reversals ]

> And of course, std::rotate can also be used, although it would
> require an extra test:

Right -- but at least in this case, the extra test is only executed
once, instead of inside a loop.

--
Later,
Jerry.

The universe is a figment of its own imagination.

BobR
Guest
Posts: n/a

 09-07-2007

Jim Langston wrote in message...
>
> Yes. Swapping two variables is a very common programming in task, where

you
> save one variable to a temp, assign the other to it, then save the temp to
> the second. It is so common, in fact, that it's in the stl.

Realistically,
> it's probably supposed to be std::swap and I'm not even sure what header
> it's supposed to be in. Whichever header, apparently <iostream> includes
> it.

#include <algorithm>

--
Bob R
POVrookie