C语言实现排序之插入排序算法

news/2024/9/19 18:38:54/ 标签: 排序算法, c语言, 算法

一、插入算法>排序算法

基本思想

        插入排序的基本思想是将未排序的元素逐个插入到已排序的序列中。初始时,假设序列的第一个元素已经被排序。然后从第二个元素开始,将其插入到已排序的序列中的适当位置,使得已排序的序列仍然有序。

步骤
  1. 初始化:假设数组的第一个元素已经排序好。
  2. 遍历数组:从第二个元素开始遍历数组。
  3. 比较并插入:对于每个未排序的元素,从当前位置开始向左比较,直到找到合适的位置插入该元素。
  4. 重复步骤2和3:重复这个过程,直到所有的元素都被插入到已排序的序列中。
示例

假设我们有一个数组 [5, 2, 4, 6, 1, 3]

  1. 第一轮:[5, 2, 4, 6, 1, 3] -> [2, 5, 4, 6, 1, 3]
  2. 第二轮:[2, 5, 4, 6, 1, 3] -> [2, 4, 5, 6, 1, 3]
  3. 第三轮:[2, 4, 5, 6, 1, 3] -> [2, 4, 5, 6, 1, 3] (6已经是最大的,无需移动)
  4. 第四轮:[2, 4, 5, 6, 1, 3] -> [1, 2, 4, 5, 6, 3]
  5. 第五轮:[1, 2, 4, 5, 6, 3] -> [1, 2, 3, 4, 5, 6]
性能分析
  • 最好情况:当输入数组已经是排序好的,时间复杂度为 O(n)。
  • 最坏情况:当输入数组是逆序的,时间复杂度为 O(n^2)。
  • 平均情况:时间复杂度为 O(n^2)。
  • 空间复杂度:O(1),因为它是原地排序。

二、代码

#include <stdlib.h>
#include <stdio.h>
#include <time.h>// 函数声明
int* create_and_generate_random_array(int size);
void print_array(int *array, int size);
void insertion_sort(int *array, int size);
int generate_random_size();int main() {int size = generate_random_size(); // 随机生成数组大小int *array = create_and_generate_random_array(size);if (array == NULL) {// 如果内存分配失败printf("Memory allocation failed\n");return 1;}// 打印原始数组(如果需要,可以取消注释)// printf("Original array:\n");// print_array(array, size);// 获取开始时间clock_t start_time = clock();// 对数组进行插入排序insertion_sort(array, size);// 获取结束时间clock_t end_time = clock();// 计算时间差并转换为毫秒double execution_time = ((double)(end_time - start_time) / CLOCKS_PER_SEC) * 1000;// 打印排序后的数组(如果需要,可以取消注释)// printf("Sorted array:\n");// print_array(array, size);printf("array_size = %d\n", size);// 打印执行时间printf("Execution time: %.2f ms\n", execution_time);// 释放分配的内存free(array);return 0;
}// 生成随机数组大小
int generate_random_size() {srand(time(NULL));return rand() % 9000 + 1000; // 生成1000到9999之间的随机数
}// 创建并生成随机数组
int* create_and_generate_random_array(int size) {int *array = (int *)malloc(sizeof(int) * size);if (array == NULL) {// 如果内存分配失败return NULL;}// 使用当前时间作为随机数种子srand(time(NULL));for (int i = 0; i < size; i++) {array[i] = rand() % 1000; // 生成0到999之间的随机数}return array;
}// 打印数组
void print_array(int *array, int size) {for (int i = 0; i < size; i++) {printf("%d ", array[i]);}printf("\n");
}// 插入排序
void insertion_sort(int *array, int size) {for (int i = 1; i < size; i++) {int key = array[i];int j = i - 1;// 将当前元素插入已排序的部分while (j >= 0 && array[j] > key) {array[j + 1] = array[j];j--;}array[j + 1] = key;}
}


http://www.ppmy.cn/news/1511604.html

相关文章

child_process.spawn简介

child_process.spawn 是 Node.js 中 child_process 模块的一个重要方法&#xff0c;它用于异步地创建子进程来执行指定的命令。下面是对 child_process.spawn 的深入解析&#xff1a; 一、基本用法 spawn 方法的基本语法如下&#xff1a; const { spawn } require(child_pr…

设计模式21-组合模式

设计模式21-组合模式&#xff08;Composite Pattern&#xff09; 写在前面 动机定义与结构定义结构主要类及其关系 C代码推导优缺点应用场景总结补充叶子节点不重载这三个方法叶子节点重载这三个方法结论 写在前面 数据结构模式 常常有一些组件在内部具有特定的数据结构。如何…

微前端架构下的离线工作能力:策略与实现

微前端架构通过将大型应用拆分为多个小型、独立的子应用&#xff0c;提高了开发效率和系统可维护性。然而&#xff0c;这种架构也带来了新的挑战&#xff0c;尤其是在支持应用的离线工作能力方面。本文将探讨微前端架构下如何实现离线工作能力&#xff0c;包括使用服务工作线程…

基于springboot-vue的毕业论文管理系统

TOC springboot251基于springboot-vue的毕业论文管理系统 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化…

集合的知识点

一、集合的简介 1.1 什么是集合 集合(Collection)&#xff0c;也是一个数据容器&#xff0c;类似于数组&#xff0c;但是和数组是不一样的。集合是一个可变的容器&#xff0c;可以随时向集合集合中添加元素&#xff0c;也可以随时从集合中删除元素。另外&#xff0c;集合还提…

前端进行分页Vue3+Setup写法

当后端不方便提供数据分页查询接口时&#xff0c;就需要前端来自己分割进行分页操作 在有可能的情况下还是建议用分页查询接口&#xff0c;减少网络数据传输 首先el-table绑定数组 分页组件&#xff0c;变量自己定义防止报错 <el-paginationlayout"->, total, siz…

Revit二次开发_使用InnoSetup打包插件

InnoSetup是一个开源的安装包制作工具。 如果是简单的安装&#xff0c;例如安装流程只需要用户选一个安装路径&#xff0c;那么直接按引导操作就行&#xff0c;甚至不需要写代码。 如果有更复杂的需求&#xff0c;通常需要使用Inno支持的Pascal脚本进行自定义。 Inno打包程序…

Unity项目优化记录

背景&#xff1a;测试反馈项目组游戏存在内存泄露&#xff0c;来找到中台这边协调排查。好家伙&#xff0c;跑了两次看了内存快照&#xff0c;再看资源组织和管理方式&#xff0c;存在的问题确实比较多。 1、修复内存泄露&#xff1a;结算界面由于资源引用丢失导致整个面板不会…

JSON Web Token (JWT): 理解与应用

JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种紧凑且自包含的方式&#xff0c;用于在各方之间以JSON对象的形式安全地传输信息。JWT通常用于身份验证和授权目的&#xff0c;因为它可以使用JSON对象在各方…

更改Docker默认存储位置

Docker镜像和容器等数据默认保存在目录/var/lib/docker目录下&#xff0c;我们可以更改Docker 的默认存储位置&#xff0c;比如改到数据盘。需注决&#xff0c;变更存储位置时&#xff0c;原来的镜像和容器有可能丢失。 1、确认docker默认存放目录 [rootkfk12 ~]# docker inf…

Linux平台Display Server与Desktop Environment

Display Driver Linux中的显示服务器&#xff08;Display Server&#xff09;是什么&#xff1f; 显示服务器是一个应用程序&#xff0c;其主要任务是协调客户端与其他操作系统&#xff0c;硬件以及彼此之间的输入和输出。显示服务器通过显示服务器协议与其客户端进行通信。 …

<数据集>骑行头盔识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;5026张 标注数量(xml文件个数)&#xff1a;5026 标注数量(txt文件个数)&#xff1a;5026 标注类别数&#xff1a;3 标注类别名称&#xff1a;[helmet, without_helmet, two_wheeler] 序号类别名称图片数框数1helm…

在Matlab中进行射频电路S、Z、Y、ABCD等参数的转换

在Matlab中进行射频电路S、Z、Y、ABCD等参数的转换 目录 在Matlab中进行射频电路S、Z、Y、ABCD等参数的转换1、转换案例-3dB电桥2、将转换结果应用到ADS中制造理想3dB电桥器件 在微带线的ABCD矩阵的推导、转换与级联-Matlab计算实例&#xff08;S、Z、Y参数转换&#xff09;中&…

SpringBoot开启多端口探究--开启gRPC端口

文章目录 前情提要一、gRPC的特别之处二、粗暴方案原始的GrpcObservabilityServer集成支持方案评价 三、改进方案基本原理改造结果 四、小结 前情提要 之前咱们聊过SpringBoot下开启多端口有3个思路&#xff0c;并分析了第一种开启独立management端口的实现细节&#xff0c;今…

【深度学习】【语音TTS】GPT-SoVITS v2 实战,训练一个人的音色,Docker镜像

文章目录 原理Dockerdocker push训练教程: https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e/xyyqrfwiu3e2bgyk 原理 Docker 不用docker不行,不好分配显卡, 做个docker镜像: docker pull pytorch/pytorch:2.1.2

【AI趋势6】大模型与游戏共振

大语言模型与游戏环境的相结合&#xff0c;正在为AI Agent训练打造最佳训练场。游戏不仅能为AI Agent训练提与现实世界类似的虚拟环境&#xff0c;还能为AI Agent训练提供清晰、可量化的评估规则&#xff0c;大幅提升技术迭代与测试效率。当前&#xff0c;包括OpenAI、DeepMind…

前端面试题-什么是JavaScript的闭包?有哪些应用场景?

定义: 一个函数能够访问其它函数内部定义的变量 形成的原理: (1)函数创建&#xff1a;在一个函数&#xff08;外部函数&#xff09;中定义另一个函数&#xff08;内部函数&#xff09;。 (2)内部函数访问&#xff1a;内部函数可以访问和修改外部函数中的局部变量。 (3)函数…

Spring Cloud Eureka快速搭建:微服务注册中心的配置步骤

Spring Cloud Eureka快速搭建&#xff1a;微服务注册中心的配置步骤 目录 引言Spring Cloud微服务架构概述什么是Eureka&#xff1f;Eureka Server的搭建步骤 4.1 创建Eureka Server项目4.2 配置Eureka Server4.3 启动Eureka Server4.4 多实例Eureka Server的搭建 Eureka Cli…

无人机电池充电器技术详解

随着无人机技术的飞速发展&#xff0c;其作为航拍、物流、农业、监测等多领域的重要工具&#xff0c;对电池续航能力和充电效率提出了更高要求。无人机电池充电器作为保障无人机长时间运行的关键设备&#xff0c;其技术水平的提升直接影响到无人机的使用效率和安全性。本文将从…

牛客网习题——通过C++实现

一、目标 实现下面4道练习题增强C代码能力。 1.求123...n_牛客题霸_牛客网 (nowcoder.com) 2.计算日期到天数转换_牛客题霸_牛客网 (nowcoder.com) 3.日期差值_牛客题霸_牛客网 (nowcoder.com) 4.打印日期_牛客题霸_牛客网 (nowcoder.com) 二、对目标的实现 1.求123...n_…