C语言实现插入排序

什么是插入排序?

插入排序(Insertion Sort) 是一种简单且逐步构建有序序列的排序算法。它的思想是将数组分为两部分:已排序的部分和未排序的部分。初始时,已排序部分只包含数组的第一个元素,然后逐步将未排序部分的元素插入到已排序部分的正确位置,直到整个数组有序为止。

插入排序的详细步骤

1、从数组的第二个元素开始,将其视为待插入的元素。
2、将待插入元素与已排序部分的元素进行比较,从已排序部分的末尾开始。
3、如果待插入元素小于已排序部分的某个元素,则将该元素向右移动一位,为待插入元素腾出插入位置。
4、重复步骤 3,直到找到待插入元素的正确位置。
5、将待插入元素插入到正确的位置。
6、重复步骤 2 到 5,直到将所有元素插入到已排序部分。

举例说明

假设我们有以下待排序的数组:[5, 2, 9, 1, 5, 6]。

第一轮: 将数组中的第一个元素(5)视为已排序部分,然后将下一个元素(2)插入到已排序部分的正确位置。
排序后数组:[2, 5, 9, 1, 5, 6]

第二轮: 将数组中的第一个和第二个元素(2, 5)视为已排序部分,然后将下一个元素(9)插入到已排序部分的正确位置。
排序后数组:[2, 5, 9, 1, 5, 6]

第三轮: 将数组中的前三个元素(2, 5, 9)视为已排序部分,然后将下一个元素(1)插入到已排序部分的正确位置。
排序后数组:[1, 2, 5, 9, 5, 6]

第四轮: 将数组中的前四个元素(1, 2, 5, 9)视为已排序部分,然后将下一个元素(5)插入到已排序部分的正确位置。
排序后数组:[1, 2, 5, 5, 9, 6]

第五轮: 将数组中的前五个元素(1, 2, 5, 5, 9)视为已排序部分,然后将下一个元素(6)插入到已排序部分的正确位置。
排序后数组:[1, 2, 5, 5, 6, 9]

最终,整个数组变得有序:[1, 2, 5, 5, 6, 9]。

示例代码

#include <stdio.h>void InsertionSortFor(int arr[], int length);void InsertionSortWhile(int arr[], int length);void PrintArray(int arr[], int length);int main()
{int arr[] = {5, 2, 9, 1, 5, 6};/*不可以放在函数内部,当数组作为函数参数传递给函数时,数组参数会被转换为指针类型,因此在函数内部无法通过sizeof操作符获取数组的长度。*/int length = sizeof(arr) / sizeof(arr[0]);printf("原始数组:");PrintArray(arr, length);InsertionSortFor(arr, length);printf("排序后的数组:");PrintArray(arr, length);return 0;
}void InsertionSortFor(int arr[], int length)
{int i, j, key;for (i = 1; i < length; i++){key = arr[i];// 从当前位置向前遍历已排序的子数组,找到合适的插入位置for (j = i - 1; j >= 0 && arr[j] > key; j--){arr[j + 1] = arr[j]; // 向右移动元素}arr[j + 1] = key; // 插入元素到正确位置}
}void InsertionSortWhile(int arr[], int length)
{int i, j, key;for (i = 1; i < length; i++){key = arr[i];j = i - 1;// 将比 key 大的元素向右移动while (j >= 0 && arr[j] > key){arr[j + 1] = arr[j];j = j - 1;}arr[j + 1] = key;}
}void PrintArray(int arr[], int length)
{int i;for (i = 0; i < length; i++){printf("%d ", arr[i]);}printf("\n");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/36070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Process.Start 报错

Process.Start 报错 System.Diagnostics.Process.StartWithShellExecuteEx Process.Start 为什么会引发“系统找不到指定的文件”异常 Process.Start 报错 找不到路径 ,System.ComponentModel.Win32Exception:“系统找不到指定的文件。 问题1、 在WinForm中可能是权限问题&…

做了这件事,精准拿捏企业资产管理!

资产管理系统是一种为组织和个人提供管理各类资产的重要工具。无论是金融资产还是实物资产&#xff0c;这些都构成了一个实体或个人财务状况的重要组成部分。 无论是企业寻求优化其固定资产维护&#xff0c;还是个人希望更好地管理他们的投资组合&#xff0c;资产管理系统在现代…

NZ系列工具NZ02:VBA读取PDF使用说明

【分享成果&#xff0c;随喜正能量】时光绽放并蒂莲&#xff0c;更是一份殷殷嘱托&#xff0c;更是一份诚挚祝福&#xff0c;是一份时光馈赠&#xff0c;又是一份时光陪伴。。 我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解…

“深入解析JVM:探索Java虚拟机的工作原理与优化技巧“

标题&#xff1a;深入解析JVM&#xff1a;探索Java虚拟机的工作原理与优化技巧 摘要&#xff1a;本文将深入探讨Java虚拟机&#xff08;JVM&#xff09;的工作原理、内部结构以及如何优化Java应用程序的性能。我们将介绍JVM的主要组件&#xff0c;包括类加载器、运行时数据区域…

关于openssl SM2 ECC以及密钥生成和签名验签

SM2是基于ECC的国密算法,本身也是ECC算法。 openssl生成ECC公私钥并签名验签 #!/bin/sh openssl ecparam -genkey -name prime256v1 -out private.pem #print pri #openssl ec -in private.pem -text -noout openssl ec -in private.pem -pubout -out public.pem #gen test.…

uniapp+uview封装小程序请求

提要&#xff1a; uniapp项目引入uview库 此步骤不再阐述 1.创建环境文件 env.js&#xff1a; let BASE_URL;if (process.env.NODE_ENV development) {// 开发环境BASE_URL 请求地址; } else {// 生产环境BASE_URL 请求地址; }export default BASE_URL; 2.创建请求文件 该…

QLExpress动态脚本引擎解析工具

介绍 QLExpress脚本引擎 1、线程安全&#xff0c;引擎运算过程中的产生的临时变量都是threadlocal类型。 2、高效执行&#xff0c;比较耗时的脚本编译过程可以缓存在本地机器&#xff0c;运行时的临时变量创建采用了缓冲池的技术&#xff0c;和groovy性能相当。 3、弱类型脚本…

广西Geotrust单位多域名https证书推荐

Geotrust是国际知名CA认证机构&#xff0c;根证书是Digicert&#xff0c;还有RapidSSL、QuickSSL等子品牌&#xff0c;拥有多种类型的多域名https证书&#xff0c;比如OV企业型https证书和EV增强型多域名https证书。那么&#xff0c;哪种多域名https证书更适合企事业单位使用呢…

SpringBoot复习:(43)如何以war包的形式运行SpringBoot程序

一、.pom.xml配置packging为war <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven…

Android 内存泄漏

名词解释 内存泄漏:即memory leak。是指内存空间使用完毕后无法被释放的现象&#xff0c;虽然Java有垃圾回收机制&#xff08;GC&#xff09;&#xff0c;但是对于还保持着引用&#xff0c; 该内存不能再被分配使用&#xff0c;逻辑上却已经不会再用到的对象&#xff0c;垃圾回…

react如何实现数据渲染

React数据渲染是指将组件中的数据映射到页面上&#xff0c;以展示出来。在React中&#xff0c;数据渲染通常是通过JSX和组件的state或props完成的。 JSX是一个类似HTML的语法&#xff0c;可以在其中嵌入JavaScript表达式。在JSX中&#xff0c;可以使用{}包裹JavaScript表达式&…

解决C语言中使用scanf输入字符串导致for循环失效的问题

在C语言编程中&#xff0c;使用scanf函数输入字符串是一项基本操作。然而&#xff0c;当我们尝试在for循环中使用scanf输入字符串时&#xff0c;可能会遇到意外的问题&#xff0c;导致循环无法正常执行。本文将深入探讨这个问题&#xff0c;并提供解决方案&#xff0c;让你能够…

考公-判断推理-定义判断

第九节课 例题 例题 例题 例题 例题 例题 脚一滑&#xff0c;就是工伤&#xff0c;这难道不是操作不当吗 例题 不要较真&#xff0c;公务员&#xff0c;把没有全局观念的人排除在公务员队伍之外 例题 例题 下次看到不字&#xff0c;先给我画上 例题 例题 例题 例题…

微信群聊微信机器人实现流程

1.注册微信账号 要使用一个微信机器人账号来实现在微信群聊中的自动回复功能&#xff0c;你需要注册一个专门用于机器人的微信账号。 注册微信机器人账号的步骤如下&#xff1a; 下载微信&#xff1a;在手机或者电脑上下载并安装微信应用程序。创建新账号&#xff1a;打开微信…

力扣63.不同路径II(动态规划)

/*** author Limg* date 2022/08/09* 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。* 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。* 现在考虑网…

探讨uniapp的生命周期问题

在uniapp中,生命周期函数分为应用生命周期函数、页面生命周期函数和组件生命周期函数. 1应用声明周期 应用生命周期函数只能在 App.vue 中监听有效&#xff0c;在其他页监听无效。 onLaunch&#xff1a;当uni-app 初始化完成时触发&#xff08;全局只触发一次&#xff09;on…

乡村振兴指数与其30余个原始变量数据(2000-2022年)

乡村振兴是当下经济学研究的热点之一&#xff0c;对乡村振兴进行测度&#xff0c;是研究基础。测度乡村振兴水平的学术论文广泛发表在《数量经济技术经济研究》等顶刊上。整理了2000-2022年城市层面的乡村振兴指数与其30余个原始变量数据&#xff0c;供大家使用。 数据来源&…

react-spring,一个react的动画库的使用

介绍 React Spring 是一个 spring physics based animation library 用于 React。它可以轻松地在 React 中实现弹性、渐变等动画效果。 使用 安装依赖&#xff1a; 使用npm&#xff1a; npm install react-spring 使用yarn&#xff1a; yarn add react-spring 导入和使用&a…

Opencv4基于C++基础入门笔记:OpenCV环境配置搭建

文章目录&#xff1a; 一&#xff1a;软件安装 二&#xff1a;配置环境&#xff08;配置完之后重启一下软件&#xff09; 1.配置电脑系统环境变量 vs2012及其以下 vs2014及其以上 2.配置VS软件环境变量 vs2012及其以下 vs2014及其以上 三&#xff1a;测试 vs2012及其…

Java 实现Rtsp 转rtmp,hls,flv

服务支撑&#xff1a;FFmpeg srs(流媒体服务器) 整个流程是 FFmpeg 收流转码 推 rtmp 到流媒体服务 流媒体服务再 分发流到公网 搭建流媒体服务: 1. SRS (Simple Realtime Server) | SRS &#xff08;本例子使用的是SrS 安装使用docker &#xff09; 2.GitHub - ZLMedi…