当前位置: 首页 > article >正文

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)数据范围明确

http://www.kler.cn/a/568735.html

相关文章:

  • 关于JavaScript性能问题的误解
  • 【前端基础】Day 7 CSS高级技巧
  • Linux 学习笔记
  • 数据集笔记:新加坡 地铁(MRT)和轻轨(LRT)票价
  • Flutter_学习记录_实现列表上拉加载更多的功能
  • electron-builder打包时github包下载失败【解决办法】
  • Python与Web3.py库:构建去中心化应用的未来
  • Java对象字段拷贝最佳实践:BeanUtils、Lombok Builder、MapStruct 深度解析(附Demo)
  • 特辣的海藻!7
  • PostgreSQL 生产环境升级指南:pg_upgrade 快速完成版本升级!
  • 入门大模型的学习路线是什么?
  • 十一、Spring Boot:使用JWT实现用户认证深度解析
  • All in One: Multi-Task Prompting for Graph Neural Networks学习笔记
  • 【面试】Java面试频繁问到的题最新整理(附答案)
  • [Lc滑动窗口_1] 长度最小的数组 | 无重复字符的最长子串 | 最大连续1的个数 III | 将 x 减到 0 的最小操作数
  • 火山引擎 DeepSeek R1 API 使用小白教程
  • 使用 ASP.NET Core 创建和下载 zip 文件
  • 剖析RabbitMQ消息可靠投递
  • 算法day4 dfs搜索2题
  • Flask-Restful