您的位置:首页 > 科技 > IT业 > 深圳vi设计培训_软件开发公司前十名_百度浏览器电脑版_谷歌浏览器直接打开

深圳vi设计培训_软件开发公司前十名_百度浏览器电脑版_谷歌浏览器直接打开

2025/5/11 12:15:06 来源:https://blog.csdn.net/2201_75539691/article/details/144335739  浏览:    关键词:深圳vi设计培训_软件开发公司前十名_百度浏览器电脑版_谷歌浏览器直接打开
深圳vi设计培训_软件开发公司前十名_百度浏览器电脑版_谷歌浏览器直接打开

在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯插入排序的理论基础
  • 💯原始代码实现及分析
    • 代码逻辑拆解
      • 1. 外层循环
      • 2. 内层循环
      • 3. 插入操作
    • 代码特点与局限性
  • 💯优化后的代码实现
    • 简化点解析
      • 1. 去掉`min`变量
      • 2. 使用`while`替代内层循环
      • 3. 插入逻辑未变
    • 代码效率对比
  • 💯插入排序的扩展与应用
    • 适用场景
    • 优化方向
    • 与其他基础排序算法的比较
  • 💯总结


在这里插入图片描述


💯前言

  • 本篇文章全面剖析了插入排序算法的设计原理、代码实现及其优化表达,同时对该算法的适用场景及潜在优化方向展开深入探讨。我们对比分析了两种不同的代码实现:一种是较为冗长的传统实现,另一种是逻辑简洁的优化版本,并进一步延伸至插入排序在复杂场景下的改进和实际应用。
    C++ 参考手册
    在这里插入图片描述

💯插入排序的理论基础

插入排序作为一种经典的比较排序算法,其基本思想基于逐步构建有序序列的过程:

  1. 将待排序数组划分为两个部分:已排序部分和未排序部分。
  2. 每次从未排序部分中提取第一个元素(称为target)。
  3. 在已排序部分中通过比较找到target的正确插入位置。
  4. 插入后,已排序部分仍然保持有序。
  5. 重复上述步骤,直至未排序部分为空。

这种操作模式与人类整理扑克牌的方式极为相似,即每次抽取新牌时,将其插入到手中已有序的牌列中,确保整体有序。插入排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2),适用于小规模或近乎有序的数据集。虽然其效率在大规模数据排序中较低,但由于其逻辑简单、实现直观,仍在教学和特定场景中具有重要意义。
在这里插入图片描述


💯原始代码实现及分析

以下是插入排序的传统代码实现:

#include <iostream>
using namespace std;
int main()
{int cards[13] = {7, 5, 1, 2, 3, 6, 8, 11, 9, 12, 10, 4, 13};for (int i = 1; i < 13; i++){int target = cards[i], min = 500, pos = -1;for (int j = 0; j < i; j++)if (cards[j] > target){if (cards[j] < min){min = cards[j];pos = j;}}if (pos != -1){for (int j = i; j > pos; j--)cards[j] = cards[j - 1];cards[pos] = target;}}for(int i = 0; i < sizeof(cards)/sizeof(cards[0]); i++){cout << cards[i] << " ";}return 0;
}

在这里插入图片描述


代码逻辑拆解

在这里插入图片描述


1. 外层循环

在这里插入图片描述

for (int i = 1; i < 13; i++)
  • 作用:
    • 外层循环负责逐步扩大已排序部分,遍历未排序部分中的元素。
    • 每次取出当前未排序部分的第一个元素(target),并尝试将其插入到已排序部分的正确位置。
  • 范围:从索引 i = 1 开始,因为初始时默认cards[0]已处于有序状态。

2. 内层循环

在这里插入图片描述

for (int j = 0; j < i; j++)if (cards[j] > target){if (cards[j] < min){min = cards[j];pos = j;}}
  • 作用:
    • 遍历当前已排序部分,找到比target大的最小元素。
    • 使用变量min记录该最小元素的值,并通过pos记录其位置。
    • 若未找到任何比target大的元素,pos保持初始值-1,表示target不需要插入。

3. 插入操作

在这里插入图片描述

if (pos != -1)
{for (int j = i; j > pos; j--)cards[j] = cards[j - 1];cards[pos] = target;
}
  • 作用:
    • 如果确定了插入点(pos != -1),通过右移元素腾出空间。
    • target插入到pos的位置,完成一次插入。

代码特点与局限性

在这里插入图片描述

  1. 复杂度分析:
    • 外层循环执行 n − 1 n-1 n1 次( n = 13 n=13 n=13),内层循环在最坏情况下执行 i i i 次。
    • 因此,总体时间复杂度为 O ( n 2 ) O(n^2) O(n2)
  2. 变量冗余:
    • 使用了额外的min变量记录比target大的最小值,这一设计虽然直观,但不必要。
  3. 逻辑复杂:
    • 内层循环的条件判断较多,代码显得冗长。


💯优化后的代码实现

在这里插入图片描述

针对上述问题,以下是优化后的插入排序代码:

#include <iostream>
using namespace std;
int main()
{int cards[13] = {7, 5, 1, 2, 3, 6, 8, 11, 9, 12, 10, 4, 13};for (int i = 1; i < 13; i++) {int target = cards[i], pos = 0;while (target > cards[pos])pos++;for (int j = i; j > pos; j--)cards[j] = cards[j - 1];cards[pos] = target;}for(int i = 0; i < sizeof(cards)/sizeof(cards[0]); i++){cout << cards[i] << " ";}return 0;
}

在这里插入图片描述


简化点解析

在这里插入图片描述


1. 去掉min变量

在这里插入图片描述

  • 优化代码通过直接比较targetcards[pos]的大小,动态更新插入位置pos,无需额外变量min
  • 这一改动使逻辑更加简洁,减少了冗余计算。

2. 使用while替代内层循环

在这里插入图片描述

while (target > cards[pos])pos++;
  • 作用:
    • while循环逐步递增pos,直至找到第一个大于或等于target的位置。
    • 相较于传统的内层for循环,while结构更符合插入点搜索的直观逻辑。

3. 插入逻辑未变

在这里插入图片描述

for (int j = i; j > pos; j--)cards[j] = cards[j - 1];
cards[pos] = target;
  • 通过逐步右移元素,为target腾出插入空间,最后将其插入到位置pos

代码效率对比

在这里插入图片描述

传统实现优化实现
使用嵌套for循环遍历和判断使用while直接定位插入点
使用额外变量min记录状态无需min,通过pos直接定位
逻辑较复杂,冗余条件判断多逻辑简洁,条件判断清晰

虽然优化后的代码在总体复杂度上并未突破 O ( n 2 ) O(n^2) O(n2) 的限制,但其结构更为简洁直观,可读性和维护性显著提升。


💯插入排序的扩展与应用

在这里插入图片描述


适用场景

在这里插入图片描述

  1. 小规模数据集:
    • 插入排序在数据量较少(如 n < 50 n < 50 n<50)时表现出色,特别是在内存占用较敏感的环境中。
  2. 近乎有序的数据:
    • 若数组接近有序,插入排序的时间复杂度接近 O ( n ) O(n) O(n),性能优异。

优化方向

在这里插入图片描述

  1. 二分查找优化插入点:
    • 使用二分查找替代顺序查找定位插入点,将搜索时间复杂度降低至 O ( log ⁡ n ) O(\log n) O(logn)
    • 结合二分查找的插入排序仍需移动元素,因此总复杂度仍为 O ( n 2 ) O(n^2) O(n2)
  2. 结合其他排序算法:
    • 在快速排序或归并排序的局部操作中,插入排序可用作优化手段,处理小范围数据时表现良好。
  3. 减少数据移动:
    • 通过链表等数据结构优化插入操作,可减少频繁的移动开销。

与其他基础排序算法的比较

在这里插入图片描述
插入排序与选择排序、冒泡排序并称为“三大基础排序算法”。其特点如下:

排序算法时间复杂度空间复杂度稳定性适用场景
插入排序 O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)稳定小规模数据、接近有序数据
选择排序 O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)不稳定小规模数据
冒泡排序 O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)稳定小规模数据、对稳定性有要求

💯总结

  • 在这里插入图片描述
    插入排序是一种经典而高效的排序算法,在数据量较小接近有序的情境下表现优异。本篇文章详细探讨了插入排序的工作原理传统代码实现及其优化表达,深入分析了其适用场景与潜在优化方向。
    尽管插入排序在大规模数据集中的表现有限,但通过结合高级算法或针对特定需求进行优化,仍能在实际场景中发挥重要作用。希望通过本篇文章,您能深入掌握插入排序的精髓,并能灵活应用于不同的算法设计中。

在这里插入图片描述


版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com