想到数组元素的移动,我最初的想法是这样的。

贴代码:

 for(i = 0; i < it_Length - it_Steps; i++){if(it_Direction == -1){Array[i] = pt_Array[i + it_Steps];}else{Array[i + it_Steps] = pt_Array[i];}}for(i = 0; i < it_Steps; i++){if(it_Direction == -1){Array[it_Length - it_Steps + i] = pt_Array[i];}else{Array[i] = pt_Array[it_Length - it_Steps + i];}}

“-1”表示左移,“1”表示右移(会由用户选择输入)。

有两个数组,用用户选择的移动长度(it_Steps)作为一个分界点,将原数组pt_Array从[it_Steps]开始的元素赋值给一个新数组Array(第一个for),再将原数组pt_Array从[0]开始到[it_Steps - 1]的元素赋值给Array。

现在想起来,这个思路确实是过于麻烦,并且只是为了实现功能而设计的。(看不下去)

之后在前辈的指导下,我又写出了两种。

一个是速度最快,不考虑内存的情况下。

一个是占内存最少,速度会有损失的情况下。

速度最快

在我知道有memcpy这个函数时,发现之前自己写的简直就是辣鸡。

函数原型为:void *memcpy(void *dest, const void *src, size_t n)

引用头文件:#include<string.h>

功能:从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中

(顺便说一句,大家如果想真正提高自己的编程水平,一定得学会自学,百度,MSDN什么的都利用起来)

如果还有什么不懂的就查吧,我就直接贴代码了。

int *Timest(int *pi_Array_in, int i_Length_in, int i_Steps_in, int i_Direction_in, int *piArray)
{if (i_Direction_in == -1){memcpy(piArray, &pi_Array_in[i_Steps_in], sizeof(int)*(i_Length_in - i_Steps_in));memcpy(&piArray[i_Length_in - i_Steps_in], pi_Array_in, sizeof(int)*i_Steps_in);}else{memcpy(&piArray[i_Steps_in], pi_Array_in, sizeof(int)*(i_Length_in - i_Steps_in));memcpy(piArray, &pi_Array_in[i_Length_in - i_Steps_in], sizeof(int)*i_Steps_in);}return piArray;
}

还是定义了两个数组,利用memcpy这个函数,左移右移可谓是很容易了。

内存最少

这一种算法可能思考起来就没那么容易了,咱们首先来思考一件事。

要使内存最少,那么也即是只使用一个数组,那么又怎么实现移动呢?

首先咱们定义一个数组int* p_Array_in(int*是因为需要传参)

大家可以将整个数组看作为一个环。

再确定一个初始位置,一般就是数组下标为零的位置了。

然后,我来帮大家理一下:

中间变量 = 未来位置的值;

未来位置的值 = 初始位置的值;

初始位置的值 =  中间变量 ;

以上也就是这个算法的核心了。

有些同学会想了,未来位置的值我怎么知道呢?

不知道大家有没有听说过约瑟夫环,有兴趣的朋友可以去了解一下,这里的道理跟那个有些相似。

公式:

ArrayLength - L, Steps - S, Index - i

i(下次) = (i(这次) + L -S)%L             (左移)

i(下次) = (i(这次) + S)%L                  (右移)

这个时候有些同学又会想了,那万一这个公式整除了怎么办?

所以这里其实有两种情况:

整除和不整除

不整除当然很简单,只需要用到核心算法就可以了,整除是有点儿麻烦,简单点说就是如果下一次的情况会整除就将初始位置的下标加1,然后继续运算。

我直接贴代码了:

int *Roomest(int *p_Array_in, int i_Length_in, int i_Steps_in, int i_Direction_in)
{int iCount = 0;int i = 0;int iInitial = 0;//最初的int iTemp;int iSelect;if (i_Direction_in == -1) {iSelect = i_Length_in - i_Steps_in;  //左移}else {iSelect = i_Steps_in;  //右移}while(iCount < i_Length_in){iTemp = p_Array_in[(i + iSelect) % i_Length_in];p_Array_in[(i + iSelect) % i_Length_in] = p_Array_in[iInitial];p_Array_in[iInitial] = iTemp;iCount++;i = ((i + iSelect) % i_Length_in);if (((i + iSelect) % i_Length_in) == iInitial)   //整除情况处理{iInitial += 1;i = iInitial;iCount++;}  }return p_Array_in;
}

还有一个问题就是计数问题了,这是控制循环结束的关键。

每做一次运算,这里的iCount就要加1,实在不明白的同学不嫌麻烦的话可以手写过程,当初我就是写了两遍才基本上明白了。

希望以上内容能给大家一些帮助,初次写blog,有哪里写得不好的地方希望大家多多包涵,当然,更希望大家给我指出来,咱们一起进步。

版权声明:原创文章,欢迎转载,转载请注明作者和链接。 https://blog.csdn.net/qq_42724600/article/details/82079247

C语言数组元素的左移、右移相关推荐

  1. C语言数组元素循环左移

    void fun(char * w,int m) { int i,n=0; char t; while(w[n]!=0) n++; for(i=0;i<m;i++) { t=w[0]; for( ...

  2. 一维数组反转c语言_C语言实现数组的循环左移,右移,翻转的示例

    数组结合指针可以实现很多有趣的功能,比如下面这个程序: 假设数组为 : 12345 如果左移一次即为:23451 ,依次类推 如果右移一次即为:51234 ,依次类推 翻转则为:54321 我们来实现 ...

  3. c语言数组最大元调换,c语言数组元素交换有关问题,请高手过来看看

    c语言数组元素交换问题,请高手过来看看 主要问题是数组元素交换不正确,以下是代码: #include #include #define PI 3.1415926 #define MAX 512 dou ...

  4. C语言数组元素总和最大的连续子序列的算法(附完整源码)

    C语言数组元素总和最大的连续子序列的算法 C语言数组元素总和最大的连续子序列的算法完整源码(定义,实现,main函数测试) C语言数组元素总和最大的连续子序列的算法完整源码(定义,实现,main函数测 ...

  5. C语言数组元素下标为何从0开始

    很多同学可能在学习数组时会有这个疑问,下标为什么不从1开始呢?从1开始不是更符合大家的日常习惯吗?生活中我们通常说第1个,而不是第0个.的确,有些计算机语言如早期的Pascal语言,数组元素的下标是从 ...

  6. 数组元素循环左移n个位置(JAVA)

    问题描述: 将n(n>1)个整数存放在一维数组R中,设计一个在时间和空间两方面都尽可能高效的算法. 将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据(x0,x1,x2, ...

  7. C语言数组元素的查询

    数组的查询 在日常的开发过程中,我们经常需要查询数组中的元素,这就需要我们使用数组元素查询的方法来进行查询. 对无序数组的查询 无序数组,就是数组元素的排列没有规律.无序数组元素查询的思路也很简单,就 ...

  8. C语言 数组元素的遍历

    一维数组 #include <stdio.h> int main(){int nums[10];int i;//从控制台读取用户输入for(i=0; i<10; i++){scanf ...

  9. PTA c语言 数组元素循环右移问题

    一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0​A1​⋯AN−1​)变换为(AN−M​⋯AN−1​A0​A1​⋯AN ...

最新文章

  1. JavaScript中 DOM操作方法
  2. Spring Security——获取当前已登录用户UserDetails对象
  3. 深度学习网络模型AlexNet
  4. 解决Silverlight中DataGrid在显示数据时多一空白列
  5. 爬虫-代理的爬取练习191110
  6. Madagascar中的宏定义--圆周率PI
  7. NSURLConnection和Runloop
  8. android 自动生成aidl,[Android]用AIDL生成Service
  9. Unity Web前端研究
  10. 如何对QQ好友的IP地址进行精准定位
  11. 记事本编码html乱码,记事本乱码怎么办【解决方法】
  12. Modbus转Profinet网关连接英威腾变频器方法
  13. CSDN搬家到博客园
  14. Hive修复外表分区时报错
  15. vmware虚拟机不能识别u盘/移动硬盘原因之一
  16. 用二维数组进行学生的成绩排序和计算
  17. 苹果付费app共享公众号_【苹果iOS付费游戏应用帐号分享】新增一款25元iOS游戏应用共享帐号...
  18. 查看计算机ip地址配置信息的命令是,查看电脑配置指令大全
  19. tomcat如何增大并发_tomcat最大并发连接数的修改方法
  20. Ubuntu 16.04 可以ping通网络,但打开网页很慢

热门文章

  1. php vc9 vc6,PHP关于VC11,VC9,VC6以及Thread Safe和Non Thread Safe版本选
  2. unity遇到问题总结
  3. Linux按列合并两文件,列的拼合
  4. Elasticsearch 7.4.0官方文档操作
  5. 如何搞懂交换机以及实现vlan间的通信
  6. 钉钉审批流的调用(官方推荐审批流)
  7. Android开发中Dialog对话框的使用
  8. 360度全景图像展开MATLAB程序
  9. Spring系列学习之Spring Roo
  10. Git详解之二:Git基础