C++数组综合训练:插入删除/进制转换/排序算法

第一部分:数组基础操作强化

1.1 数组元素插入(动态位移版)

复制代码
// 示例:在指定位置插入元素
int a[11], i, n, x, y;
cin >> n;  // 当前元素数量
for(i = 0; i < n; i++) cin >> a[i];
cin >> x >> y;    // 输入插入位置(从1开始计数)和元素值
x--;              // 转换为数组下标

// 关键算法:从后向前移动元素(时间复杂度O(n))
for(i = n; i >= x; i--) {
    a[i + 1] = a[i];  // 元素后移
}
a[x] = y;  // 插入新元素
n++;        // 更新元素数量

// 输出结果
for(i = 0; i < n; i++) {
    cout << a[i] << " ";
}

1.2 数组元素删除(覆盖法)

复制代码
// 示例:删除指定元素所有出现
int a[11], n, x;
cin >> n;
for(int i = 0; i < n; i++) cin >> a[i];
cin >> x;  // 要删除的元素值

// 双指针法实现删除(时间复杂度O(n))
int j = 0;  // 新数组指针
for(int i = 0; i < n; i++) {
    if(a[i] != x) {
        a[j++] = a[i];  // 保留非删除元素
    }
}
n = j;  // 更新元素数量

// 输出结果
for(int i = 0; i < n; i++) {
    cout << a[i] << " ";
}

第二部分:进制转换

2.1 十进制转任意进制(2-9进制)

复制代码
void convertBase(int num, int base) {//num代表十进制,base代表转换的进制
    int digits[32], i = 0;
    
    // 短除法转换核心算法
    while(num > 0) {
        digits[i++] = num % base;
        num /= base;
    }
    
    // 逆向输出余数
    for(int j = i-1; j >= 0; j--) {
        cout << digits[j];
    }
}

2.2 二进制转十六进制

复制代码
string binaryToHex(string binary) {
    // 补齐4位倍数长度
    while(binary.length() % 4 != 0) {
        binary = "0" + binary;
    }
    
    string hex;
    const char hexDigits[] = "0123456789ABCDEF";
    
    // 四位一组转换
    for(int i=0; i<binary.length(); i+=4) {
        int val = 0;
        for(int j=0; j<4; j++) {
            val = val*2 + (binary[i+j]-'0');
        }
        hex += hexDigits[val];
    }
   
    return hex;
}

第三部分:排序算法精讲

3.1 冒泡排序(优化版)

复制代码
void bubbleSort(int arr[], int n) {
    bool swapped;
    for(int i=0; i<n-1; i++) {
        swapped = false;
        for(int j=0; j<n-i-1; j++) {
            if(arr[j] > arr[j+1]) {  // 相邻元素比较
                swap(arr[j], arr[j+1]);
                swapped = true;
            }
        }
        if(!swapped) break;  // 提前终止优化
    }
}

3.2 桶排序(去重排序版)

复制代码
void bucketSort() {
    int n, num, count = 0;
    int buckets[10001] = {0};
    
    cin >> n;
    for(int i=0; i<n; i++) {
        cin >> num;
        if(buckets[num] == 0) {  // 去重判断
            count++;
            buckets[num] = 1;  // 标记存在
        }
    }
 
    cout << "Unique elements: " << count << endl;
    for(int i=0; i<10001; i++) {
        if(buckets[i] == 1) {
            cout << i << " ";
        }
    }
}

第四部分:知识要点总结

  1. 数组操作核心

    • 插入/删除的时间复杂度均为O(n)

    • 必须预留足够空间

    • 注意边界条件处理

  2. 进制转换本质

    • 基于短除法的余数收集

    • 注意不同进制的字符表示

    • 处理补位和对齐问题

  3. 排序算法特性

    算法 时间复杂度 空间复杂度 适用场景
    冒泡排序 O(n²) O(1) 教学演示/小数据量
    桶排序 O(n+k) O(k) 数据范围明确
相关推荐
2401_841495641 分钟前
【机器学习】朴素贝叶斯法
人工智能·python·数学·算法·机器学习·概率论·朴素贝叶斯法
时间醉酒16 分钟前
逻辑回归(四):从原理到实战-训练,评估与应用指南
人工智能·python·算法·机器学习·逻辑回归
Zheng照邻、35 分钟前
VLM Prompt优化之 DynaPrompt(ICLR 2025)论文总结
人工智能·算法·语言模型·prompt·aigc
CoovallyAIHub36 分钟前
机器人“大脑”遭遇认知冻结攻击!复旦等提出FreezeVLA,一张图片即可瘫痪多模态大模型
深度学习·算法·计算机视觉
无敌最俊朗@1 小时前
死锁 (Deadlock) 深度解析
算法
西阳未落1 小时前
欧拉路径与欧拉回路
算法·深度优先
序属秋秋秋1 小时前
《C++进阶之C++11》【可变参数模板 + emplace接口 + 新的类功能】
c++·笔记·学习·c++11·可变参数模板·emplace系列接口
Pocker_Spades_A1 小时前
C++程序设计上机作业(1)
开发语言·c++
Swift社区2 小时前
LeetCode 390 消除游戏
算法·leetcode·游戏
Chen--Xing2 小时前
OpenMP并行化编程指南
c++·密码学·openmp