目录
数组是一种常见的容器,本次我们练习一下数组逆置问题。
在解决问题之前,我们第一步是要明确问题是什么,然后思考解决问题的方法,最后写代码进行实现
第一步:分析问题,找到解决问题的思路
由上图可以分析,数组逆置需要将中心点两边的元素进行交换 。
那么这又延伸出两个问题,如何选取中心点?如何交换两个元素?
第二步:选取中心点
一个数组的元素个数 n 要么是奇数,要么是偶数,这里我们分情况继续分析。
1.如果是奇数,那么中间点的数组下标就是 n / 2 。比如说n= 5,那么 5 / 2 =2,我们需要交换两次;
需要交换(a[0],a[4] )、(a[1],a[3]) // 括号中左面一个元素没有到达中心点 a[2]
2.如果是偶数,中心点依旧 是 n / 2 。比如说n= 4,4 /2 =2;需要交换两次;
需要交换(a[0],a[3] )、(a[1],a[2]) //括号中左面一个元素没有到达中心点 a[2]
由此我们得出,中心点的位置为 n / 2 ;并且交换的次数为中心点的下标数 n / 2 (n为数组元素个数)
第三步:元素交换
根据已经学过的知识,交换两个元素需要用指针,这样才不会交换两个数的副本(即无效交换)
void swap (int *num1,int *num2){
int temp;
temp=*num_one;//存放num_one的中间变量
*num_one=*num_two;
*num_two=temp;
}
第四步:双指针遍历数组
有了交换两个数的方法,那么我们怎么遍历整个数组呢,或者说怎么样快速高效的将中心点两边的所有元素进行交换呢?
这里我们使用双指针的方法,所谓双指针是指一个指针 i 指向数组的开头,另一个指针 j 指向数组的末尾。
我们让 i 不断自增,让j不断自减,直到 i 到达数组中间点的前一个位置,这表示已经全部交换完毕
第五步:代码实现
终于到了最激动人心的环节了,根据我们以上分析出来的思路,现在开始码代码
#include <stdio.h>
void swap (int *num1,int *num2){ //交换两个元素的函数
int temp;
temp=*num1;
*num1=*num2;
*num2=temp;
}
//逆置函数
void reverseArray(int *array,int num)//num为数组元素个数
{
int * half=array + num / 2; // 数组中间点
int * i=array; //头指针
int * j=array+num-1; //尾指针
while(i<half){
swap(i,j);
i++,j--;
}
}
int main(){
int a[10],n; //n为数组元素个数
scanf("%d",&n);
printf("逆置前:\n");
for(int i=0;i<n;i++)
scanf("%d",a+i);
reverseArray(a,n);
printf("逆置后:\n");
for(int i=0;i<n;i++)
printf("%d ",*(a+i));
return 0;
}
测试结果:
当 n 为奇数
当 n 为偶数
总结:
虽说程序并不复杂,但是也需要我们很细心的分析问题,找到解决问题的思路,这里用到了一些指针运算,加固我们对指针的理解。