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) 数据范围明确
相关推荐
草莓熊Lotso22 分钟前
【数据结构初阶】--算法复杂度的深度解析
c语言·开发语言·数据结构·经验分享·笔记·其他·算法
KyollBM28 分钟前
【CF】Day75——CF (Div. 2) B (数学 + 贪心) + CF 882 (Div. 2) C (01Trie | 区间最大异或和)
c语言·c++·算法
feiyangqingyun41 分钟前
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
c++·qt·udp·gb28181
CV点灯大师43 分钟前
C++算法训练营 Day10 栈与队列(1)
c++·redis·算法
GGBondlctrl1 小时前
【leetcode】递归,回溯思想 + 巧妙解法-解决“N皇后”,以及“解数独”题目
算法·leetcode·n皇后·有效的数独·解数独·映射思想·数学思想
武子康1 小时前
大数据-276 Spark MLib - 基础介绍 机器学习算法 Bagging和Boosting区别 GBDT梯度提升树
大数据·人工智能·算法·机器学习·语言模型·spark-ml·boosting
武子康1 小时前
大数据-277 Spark MLib - 基础介绍 机器学习算法 Gradient Boosting GBDT算法原理 高效实现
大数据·人工智能·算法·机器学习·ai·spark-ml·boosting
成工小白2 小时前
【C++ 】智能指针:内存管理的 “自动导航仪”
开发语言·c++·智能指针
sc写算法2 小时前
基于nlohmann/json 实现 从C++对象转换成JSON数据格式
开发语言·c++·json