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) 数据范围明确
相关推荐
夏末秋也凉31 分钟前
力扣-动态规划-674 最长连续递增序列
算法·leetcode·动态规划
吃瓜市民38 分钟前
146. LRU 缓存
算法·缓存·lru
慕容晓开41 分钟前
c++,优先队列
数据结构·c++·算法
m0_748234521 小时前
SpringMVC 请求参数接收
前端·javascript·算法
Vitalia1 小时前
贪心人生,贪心算法
算法·贪心算法
机器学习之心1 小时前
免费|基于蜣螂算法DBO、灰狼算法GWO、鲸鱼算法WOA、牛顿-拉夫逊优化算法NRBO实现复杂山地模型下无人机路径规划Matlab代码
算法·matlab·无人机
最后一个bug1 小时前
一种事件驱动的设计模式-Reactor 模型
linux·c语言·arm开发·算法·设计模式
Neil__Hu2 小时前
Go的基本语法学习与练习
java·c语言·c++·python·qt·学习·golang
彬sir哥2 小时前
水仙花数(华为OD)
java·c语言·javascript·c++·python·算法
clownAdam2 小时前
通俗易懂的分类算法之K近邻详解
人工智能·算法·分类·数据挖掘·knn·k邻近