如何用嵌套for循环实现C++数组反转?遇问题求助
问题分析
你当前的问题出在内层循环的终止条件没有随着外层循环调整——每次外层循环后,已经有一个元素被放到了正确的末尾位置,但内层循环仍然遍历整个数组,导致已经归位的元素又被重新交换移动,无法实现反转。
比如你的数组[1,2,3]:
- 第一次外层循环执行后,数组变成
[2,3,1](1已归位到末尾) - 第二次外层循环的内层循环仍然遍历整个数组,会先交换2和3得到
[3,2,1],接着又交换2和1得到[3,1,2],把已经归位的1又移到了中间。
修正方案
需要让内层循环只处理尚未归位的前半部分元素,每次外层循环后,未处理的元素数量减1,内层循环的终止条件也对应调整。
修改后的代码如下:
#include <iostream> using namespace std; int main() { int arr[] = {1,2,3}; int length = sizeof(arr)/sizeof(arr[0]); int temp; // Before reverse cout << endl; for (int j = 0; j < length; j++) { cout << arr[j] << " "; } // 外层循环执行length-1次即可完成反转 for(int l = 0; l < length - 1; l++) { // 内层循环只处理前length-1-l个元素(跳过已归位的l个末尾元素) for(int i = 0; i < length - 1 - l; i++) { temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; } } // After Reverse cout << endl; for (int k = 0; k < length; k++) { cout << arr[k] << " "; } }
逻辑解释
- 外层循环:数组长度为
n时,只需要执行n-1次外层循环,因为每次都会把一个未处理的首元素移到未处理部分的末尾,n-1次后所有元素都归位。 - 内层循环:每次外层循环
l后,已经有l个元素在末尾正确位置,所以内层循环只需要处理前n-1-l个元素,避免触碰已经归位的元素。
运行修改后的代码,输出会是:
1 2 3 3 2 1
内容的提问来源于stack exchange,提问作者cindicate
相关产品推荐
相关产品推荐

