逆置算法和数组循环移动算法

元素逆置

  • 概述:其实就是将 第一个元素和最后一个元素交换,第二个元素和倒数第二个元素交换,依次到中间位置。
  • 用途:可用于数组的移动,字符串反转,链表反转操作,栈和队列反转等操作。

逆置图解

代码

c 复制代码
// 逆置元素算法
void Reverse(int R[] , int l , int r){
    // R 数组,l 左边 r 右边
    int i , j ,temp;
    for(i=l , j=r; i < j; i++,j--){					// i < j 不过数组个数是奇数还是偶数都行
        temp = R[i];
        R[i] = R[j];
        R[j] = temp;
    }
}

注意:逆置算法很简单,但是能延申其他的算法


循环移动算法

  • 考研常考的一个算法,结合逆置算法,可进行实现

循环左移(右移)算法

图解
  • 第一步:循环左移 p 个元素,就将 数组前 p 个(0~p-1)元素先进行逆置
  • 第二步:再将 数组 p-1位置 之后的(n-p)个元素进行逆置
  • 第三步:将 整个数组 整体进行逆置,即可得到 循环左移 p 个元素
代码
c 复制代码
// 逆置元素算法
void Reverse(int R[] , int l , int r){
    // R 数组,l 左边 r 右边
    int i , j ,temp;
    for(i=l , j=r; i < j; i++,j--){
        temp = R[i];
        R[i] = R[j];
        R[j] = temp;
    }
}
// 循环左移算法
void LeftMove(int R[] , int n , int p){
    // r 数组 n 数组元素个数 p 循环左移个数
    if(p<0 || p>n){
        cout <<"ERROR"<<endl; 
    }else{
        Reverse(r , 0 , p-1);        // 先逆置前p个
        Reverse(r , p , n-1);        // 再逆置后n-p个
        Reverse(r , 0 , n-1);        // 最后再把所有的都逆置
    }
}

时间复杂度分析

复制代码
①:第一行 Reverse 执行频度为:1 + (p-1-0+1)/2
②:第二行 Reverse 执行频度为:1 + (n-1-p+1)/2
③:第三行 Reverse 执行频度为:1 + (n-1-0+1)/2
f(n) = 3 + n
T(n) = O(f(n)) = O(n)
空间复杂度
复制代码
由于可以看到在 整个算法中,我们只定义了变量,并未定义其他数据结构,也未使用递归,所以空间复杂度是常数级别。为 O(1)
相关推荐
琳达爱分享7 分钟前
从单机令牌桶到集群限流:一次配额超发的复盘
后端·算法
range11 分钟前
带TTL的LRU缓存的实现-字节手撕-26/10/19
算法
糖果豆豆12 分钟前
n log n 到底从哪来?排序下界、2-SAT 与 3-SAT、停机问题,卡的是同一件事
算法·架构
地平线开发者14 分钟前
【玩转 征程6 算法工具链:PTQ 工具篇】hb_verifier
算法·自动驾驶
171320330计算机毕设编程15 分钟前
计算机毕业设计 基于springboot+vue的在线观鸟视频播放网站 LW PPT
java·大数据·vue.js·spring boot·算法·课程设计
himobrinehacken1 小时前
位运算揭秘:左右移与符号位陷阱
c语言·c++·算法·安全
INGNIGHT1 小时前
815 · 课程表IV(dfs)
算法·深度优先
Pniubi2 小时前
力扣146.LRU缓存机制
算法·leetcode·缓存
云上工程笔记2 小时前
2026年7B到67B模型训练与推理GPU配置评测:LoRA、量化与全量微调对比
人工智能·算法·机器学习
softlgh2 小时前
鼾声识别:嵌入式离线鼾声检测 SDK 与睡眠健康数据
算法·智能家居·智能音箱·鼾声识别·智能枕头·打呼噜