446,218 Members | 1,111 Online Need help? Post your question and get tips & solutions from a community of 446,218 IT Pros & Developers. It's quick & easy.

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

 P: n/a 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. Sep 5 '07 #1
8 Replies

 P: n/a 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 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 ) ); for ( int i = 0; i < sizeof( Array ) / sizeof( Array ); ++i ) std::cout << Array[i] << " "; std::cout << "\n"; int Array2[] = { 1, 2, 3, 4, 5, 6, 7 }; reverseHalves( Array2, sizeof( Array2 ) / sizeof( Array2 ) ); for ( int i = 0; i < sizeof( Array2 ) / sizeof( Array2 ); ++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. Sep 6 '07 #2

 P: n/a On Sep 5, 8:19 pm, "Jim Langston" 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 ) ); for ( int i = 0; i < sizeof( Array ) / sizeof( Array ); ++i ) std::cout << Array[i] << " "; std::cout << "\n"; int Array2[] = { 1, 2, 3, 4, 5, 6, 7 }; reverseHalves( Array2, sizeof( Array2 ) / sizeof( Array2 ) ); for ( int i = 0; i < sizeof( Array2 ) / sizeof( Array2 ); ++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? Sep 6 '07 #3

 P: n/a In article <11**********************@22g2000hsm.googlegroups. com>, ch**********@yahoo.com 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 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. Sep 6 '07 #4

 P: n/a On 9 6 , 7 50 , cheetahcl...@yahoo.com 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. Sep 6 '07 #5

 P: n/a 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 atthiscode, although you'll have to fix one bug when the arrays are odd sized:#include 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 ) ); for ( int i = 0; i < sizeof( Array ) / sizeof( Array ); ++i ) std::cout << Array[i] << " "; std::cout << "\n"; int Array2[] = { 1, 2, 3, 4, 5, 6, 7 }; reverseHalves( Array2, sizeof( Array2 ) / sizeof( Array2 ) ); for ( int i = 0; i < sizeof( Array2 ) / sizeof( Array2 ); ++i ) std::cout << Array2[i] << " "; std::cout << "\n";}Output:4 5 6 1 2 35 6 7 4 1 2 3The output is close to what you want except for odd, where the questionbecomes... do you want4567123or5671234Fix 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

 P: n/a On Sep 6, 3:03 am, Jerry Coffin , cheetahcl...@yahoo.com 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 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:ja*********@gmail.com 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 Sep 6 '07 #7

 P: n/a In article <11**********************@g4g2000hsf.googlegroups. com>, ja*********@gmail.com says... On Sep 6, 3:03 am, Jerry Coffin

 P: n/a 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 -- Bob R POVrookie Sep 7 '07 #9

### This discussion thread is closed

Replies have been disabled for this discussion. 