C语言数组元素的左移、右移
想到数组元素的移动,我最初的想法是这样的。
贴代码:
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语言数组元素的左移、右移相关推荐
- 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( ...
- 一维数组反转c语言_C语言实现数组的循环左移,右移,翻转的示例
数组结合指针可以实现很多有趣的功能,比如下面这个程序: 假设数组为 : 12345 如果左移一次即为:23451 ,依次类推 如果右移一次即为:51234 ,依次类推 翻转则为:54321 我们来实现 ...
- c语言数组最大元调换,c语言数组元素交换有关问题,请高手过来看看
c语言数组元素交换问题,请高手过来看看 主要问题是数组元素交换不正确,以下是代码: #include #include #define PI 3.1415926 #define MAX 512 dou ...
- C语言数组元素总和最大的连续子序列的算法(附完整源码)
C语言数组元素总和最大的连续子序列的算法 C语言数组元素总和最大的连续子序列的算法完整源码(定义,实现,main函数测试) C语言数组元素总和最大的连续子序列的算法完整源码(定义,实现,main函数测 ...
- C语言数组元素下标为何从0开始
很多同学可能在学习数组时会有这个疑问,下标为什么不从1开始呢?从1开始不是更符合大家的日常习惯吗?生活中我们通常说第1个,而不是第0个.的确,有些计算机语言如早期的Pascal语言,数组元素的下标是从 ...
- 数组元素循环左移n个位置(JAVA)
问题描述: 将n(n>1)个整数存放在一维数组R中,设计一个在时间和空间两方面都尽可能高效的算法. 将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据(x0,x1,x2, ...
- C语言数组元素的查询
数组的查询 在日常的开发过程中,我们经常需要查询数组中的元素,这就需要我们使用数组元素查询的方法来进行查询. 对无序数组的查询 无序数组,就是数组元素的排列没有规律.无序数组元素查询的思路也很简单,就 ...
- C语言 数组元素的遍历
一维数组 #include <stdio.h> int main(){int nums[10];int i;//从控制台读取用户输入for(i=0; i<10; i++){scanf ...
- PTA c语言 数组元素循环右移问题
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN ...
最新文章
- JavaScript中 DOM操作方法
- Spring Security——获取当前已登录用户UserDetails对象
- 深度学习网络模型AlexNet
- 解决Silverlight中DataGrid在显示数据时多一空白列
- 爬虫-代理的爬取练习191110
- Madagascar中的宏定义--圆周率PI
- NSURLConnection和Runloop
- android 自动生成aidl,[Android]用AIDL生成Service
- Unity Web前端研究
- 如何对QQ好友的IP地址进行精准定位
- 记事本编码html乱码,记事本乱码怎么办【解决方法】
- Modbus转Profinet网关连接英威腾变频器方法
- CSDN搬家到博客园
- Hive修复外表分区时报错
- vmware虚拟机不能识别u盘/移动硬盘原因之一
- 用二维数组进行学生的成绩排序和计算
- 苹果付费app共享公众号_【苹果iOS付费游戏应用帐号分享】新增一款25元iOS游戏应用共享帐号...
- 查看计算机ip地址配置信息的命令是,查看电脑配置指令大全
- tomcat如何增大并发_tomcat最大并发连接数的修改方法
- Ubuntu 16.04 可以ping通网络,但打开网页很慢