顺序表第八题(逆置顺序表中指定范围元素)

文章描述了一种在不使用额外空间的情况下,通过三次逆置操作实现数组中两个线性表互换位置的方法。首先对整个数组进行逆置,然后逆置线性表B,最后逆置线性表A,从而达到A和B互换的目的,优化了空间复杂度。
摘要由CSDN通过智能技术生成

8.已知在以为数组A[m+n]中一次存放两个线性表(a1,a2...,am)和

   (b1,b2,,,,bn),现需要将两个线性表互换位置,b在前,a在后

思路:

数组a:

              1              2           3            4

数组b:

               11           22          33        44        55          66

操作前数组A[m+n]:

              1         2            3            4            11              22             33           44           55           66             

操作后数组A[n+m]:

              11         22         33           44          55             66              1             2             3              4

可以再创建一个数组,

把后面的先放过去,然后前面的再把它放过去就可以了

但是这样空间复杂度就高了

那我们最好就是就地的方法,不需要额外的增加空间就能够完成

我们先把整个数组给它逆置

             66         55        44          33          22          11          4             3           2            1

然后逆置数组b

            11          22          33          44          55         66           4             3            2          1

最后逆置数组a

             11          22         33          44           55         66          1             2            3           4

这种逆置方法是在它本身的数值里面操作完成的,

不需要额外增加其余的空间

这样的话,我们的算法的效率也是非常高的

代码:

#include<stdio.h>

#include<stdlib.h>

void     reverse(int *arr,   int from,  int end)

         if(from>end){

                      return;

            }

            int  tmp;

           for(int  i=from;i<=(from+end)/2;i++){//'='是指到了中间的那个点要换回来

            tmp=*(arr+i);

             *(arr+i)=*(arr+end-i+from);

              *(arr+end-i+from)=tmp;

          }

int main(){

         int  arr[]={1,2,3,4,5,11,22,33,44,55,66};

         reverse(arr,0,10);

         reverse(arr,0,5);

         reverse(arr,6,10);

          for(int i=0;i<l1;i++){

            printf("%d ",arr[i]);

         }

          return    0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值