在学习了数组顺序排序后碰到需要将数组内的元素排序颠倒过来的练习,虽然思路比较简单,不过通过左右夹逼的方法还是挺常用的,在此作为排序拓展记录。
先给自己出道题目,将{2,0,1,9}中的元素逆置,即
这样我们需要先知道数组长度以提取下标进行操作,可以通过
sizeof(arr)/sizeof(arrType)
来获取数组的长度。
再观察图片可知道这是通过先将数组第0位与数组最后一位通过下标进行值交换,再将第0+1位与数组最后一位-1位进行值交换的循环过程,即将数组第n位与数组长度-1-n位进行值交换。那么有了思路我们就可以开始写代码了。
先定义一个不定长度的数组存放我们的元素,再根据我们的思路获取数组的长度
int arr[]={2,0,1,9};
int lenA = sizeof(arr)/sizeof(int);
接下来写循环,由于当左边值下标i递增时,右边值也会跟着减小,当左边值小于右边值时执行循环,
我在第一次写时写为当左边值下标小于数组长度/2时进入循环,即
for (int i = 0; i< lenA / 2; i++) {}
这样做的弊端在于如果编译器进行四舍五入就会多执行一次,不过vs编译器是直接截断所以我还是用了。
这样就获取到了第n轮的轮换值的下标了,左边值下标为i,右边值下标为lenA-i-1,就剩下值交换的过程了,而c++要通过第三方进行值交换,我个人又不喜欢在for里面声明临时变量,所以就有了下面的代码
int arr[] = {1,3,2,5,4 };
int lenA =sizeof(arr) / sizeof(int);
int z;
for (int i = 0;i < lenA / 2; i++) {
z = arr[i];
arr[i] =arr[lenA - 1 - i];
arr[lenA - 1- i] = z;
}
不过这样的写法我发现并不能体现夹逼的思想,于是我们需要进行小改动
首先是for循环条件,既然是夹逼那下标就会逐步缩小范围,当左边值下标小于右边值下标时执行循环,即
for (int i = 0;i < lenA; i++) {}
改了循环条件后循环体也要改一改,在里面加上右边值下标的递减过程;
lenA - -;
改完后就变得直观了许多:
int lenA =sizeof(arr) / sizeof(int)-1;
int z = 0;
for (int i = 0;i < lenA; i++) {
z = arr[i];
arr[i] =arr[lenA];
arr[lenA] =z;
lenA--;
}
结果也是肯定的
所以思路还是相当重要的,理应先于代码。