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) 数据范围明确
相关推荐
木木子222 小时前
# 密码强度检测深度解析:正则表达式实时分析、多维度评分算法与可视化反馈
mysql·算法·华为·正则表达式·harmonyos
Sw1zzle5 小时前
算法入门(四):二叉树 - 递归遍历三件套
算法·leetcode
万法若空5 小时前
【算法-查找】查找算法
java·数据结构·算法
海石6 小时前
子树怎么找?树的3种遍历方式来帮忙!
算法·leetcode
海石6 小时前
难度分 1588:思路 + 技巧 = AC
算法·leetcode
殳翰6 小时前
下服务器端开发流程及相关工具介绍(C++)
开发语言·c++
青瓦梦滋7 小时前
协议定制/序列化-反序列化(Linux视角)
linux·服务器·网络·c++
珠海西格电力9 小时前
云边端协同架构:零碳园区管理系统的技术底座
大数据·运维·人工智能·算法·架构·能源
山登绝顶我为峰 3(^v^)310 小时前
C/C++ 交叉编译方法
java·c语言·c++
还有多久拿退休金11 小时前
让飞书知识库跟着 commit 自己长:一套自动化知识库的真实实现
前端·算法·架构