1.1 数组逆置(C语言实现)

目录

     第一步:分析问题,找到解决问题的思路

     第二步:选取中心点

     第三步:元素交换

     第四步:双指针遍历数组

     第五步:代码实现

     测试结果:

     总结:


数组是一种常见的容器,本次我们练习一下数组逆置问题。

在解决问题之前,我们第一步是要明确问题是什么,然后思考解决问题的方法,最后写代码进行实现

第一步:分析问题,找到解决问题的思路

由上图可以分析,数组逆置需要将中心点两边的元素进行交换 。

那么这又延伸出两个问题,如何选取中心点?如何交换两个元素?

第二步:选取中心点

一个数组的元素个数 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 指向数组的开头,另一个指针 指向数组的末尾。

我们让 i  不断自增,让j不断自减,直到   到达数组中间点的前一个位置,这表示已经全部交换完毕

第五步:代码实现

终于到了最激动人心的环节了,根据我们以上分析出来的思路,现在开始码代码

#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  为偶数

总结:

虽说程序并不复杂,但是也需要我们很细心的分析问题,找到解决问题的思路,这里用到了一些指针运算,加固我们对指针的理解。

猜你喜欢

转载自blog.csdn.net/xiaohaiguang/article/details/105487551
1.1