【C语言】深入解析插入排序算法

server/2024/10/22 17:22:49/

一、基本思想

 插入排序(Insertion Sort)是一种简单直观的算法>排序算法。其基本思想是将无序序列逐个插入到有序序列中,从而得到一个新的有序序列。插入排序类似于我们日常生活中整理扑克牌的过程,每次将一张牌插入到已经有序的牌中,最终得到一个有序的牌序列。

二、算法步骤

  1. 从第一个元素开始,该元素可以认为已经被排序;
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  5. 将新元素插入到该位置后;
  6. 重复步骤2~5。

三、性能分析

 插入排序的时间复杂度为O( n 2 n^2 n2),空间复杂度为O(1)。在最坏情况下,插入排序需要比较次数为 n ∗ ( n − 1 ) / 2 n*(n-1)/2 n(n1)/2,交换次数为 ( n − 1 ) ∗ ( n − 2 ) / 2 (n-1)*(n-2)/2 (n1)(n2)/2。在最坏情况下,插入排序的时间复杂度与冒泡排序和选择排序相同,但是插入排序在最好情况下的时间复杂度为O( n n n),这是因为在最好情况下,插入排序不需要进行交换操作。此外,插入排序是一种稳定的算法>排序算法

四、C语言实现示例

#include <stdio.h>
void insertion_sort(int arr[], int n) {int i, j, key;for (i = 1; i < n; i++) {key = arr[i];j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j = j - 1;}arr[j + 1] = key;}
}
int main() {int arr[] = {12, 11, 13, 5, 6};int n = sizeof(arr) / sizeof(arr[0]);insertion_sort(arr, n);printf("Sorted array: \n");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

运行结果:

Sorted array:
5 6 11 12 13

五、总结

 插入排序是一种简单直观的算法>排序算法,其时间复杂度为O(n^2),空间复杂度为O(1)。插入排序在最好情况下的时间复杂度为O(n),是一种稳定的算法>排序算法。在实际编程中,插入排序适用于数据量较小或者基本有序的场景。通过本文的学习,希望读者能够深入理解插入算法>排序算法,并在实际编程中灵活运用。


http://www.ppmy.cn/server/3144.html

相关文章

C++设计模式|创建型 2.工厂模式

1.简单工厂思想 简单工厂模式不属于23种设计模式之⼀&#xff0c;更多的是⼀种编程习惯。它的核心思想是将产品的创建过程封装在⼀个⼯⼚类中&#xff0c;把创建对象的流程集中在这个⼯⼚类⾥⾯。卡码网将其结构描述为下图所示的情况&#xff1a; 简单⼯⼚模式包括三个主要⻆⾊…

java音乐播放器系统设计与实现springboot-vue

后端技术 SpinrgBoot的主要优点有&#xff1a; 1、为所有spring开发提供了一个更快、更广泛的入门体验&#xff1b; 2、零配置&#xff1b; 3、集成了大量常用的第三方库的配置&#xff1b; Maven: 项目管理和构建自动化工具&#xff0c;用于java项目。 java: 广泛使用的编程语…

Redis面试

数组结构 String、Map、Set、ZSet、List 持久化 AOF:追加日志持久化操作&#xff0c;将写命令追加到一个文件的末尾。redis重启时&#xff0c;执行这些操作。更可靠。不会出现数据丢失的问题。写入硬盘的频率配置&#xff1a;每秒同步、每写入命令同步、禁止同步 RDB:快照持…

后台管理系统加水印(react)

效果 代码图片 代码 window.waterMark function (config) {var defaultConfig {content: 我是水印,fontSize: 16px,opacity: 0.3,rotate: -15,color: #ADADAD,modalId: J_waterMarkModalByXHMAndDHL,};config Object.assign({}, defaultConfig, config);var existMarkModal…

TCP/IP常用协议栈图解

1.引言 最近看了一些计算机网络的课程&#xff0c;总结借鉴了一些TCP/IP常用协议&#xff0c;罗列在以下图中&#xff0c;以便有一个整体观。 2.图解 先上图 3.总结 TCP/IP协议是实际用的计算机网络通信的标准协议栈&#xff0c;自上而下分为应用层&#xff0c;传输层&#xf…

Sentinel 流控注解使用

大概原理&#xff1a;通过反射解析注解 SentinelResource信息完成调用&#xff0c;处理方法&#xff0c;类似AOP编程 处理方法的返回类型要保持一致&#xff0c;参数和顺序保持一致&#xff0c; 可以在参数列表最后加 com.alibaba.csp.sentinel.slots.block.BlockException; …

什么是XXE攻击?如何进行防护

安全性很难做到正确&#xff0c;即使在当今具有安全意识的世界中&#xff0c;也存在一些严重的漏洞&#xff0c;例如 XML 外部实体 (XXE)&#xff0c;它们被忽视并最终成为破坏的原因。 XML 外部实体 (XXE) 攻击是一种计算机安全漏洞&#xff0c;通常存在于 Web 应用程序中&…

flink on k8s部署

在 Kubernetes 上部署一套 Flink 集群需要使用 Kubernetes 原生资源和工具,如 StatefulSet、Deployment、Service 等,或使用专门的 Flink Operator 来自动化和简化 Flink 集群的部署和管理。以下是一般的部署步骤: 使用 Flink Operator 部署 Flink 集群: 安装 Flink Opera…