数据结构的直接插入排序(C语言版)

一.直接插入排序的基本概念

1.直接插入排序的基本思想

  1. 将数组分为已排序和未排序两部分。

  2. 每次从未排序部分取出一个元素,将其插入到已排序部分的合适位置,使得已排序部分保持有序。

  3. 重复步骤2,直到整个数组有序。

2.排序的工作原理

  1. 假设前 i-1 个元素已经有序,现在要将第 i 个元素插入到前 i-1 个有序元素中,使得前 i 个元素也有序。

  2. 为了插入第 i 个元素,需要先找到它在前 i-1 个元素中的适当位置。可以从右到左依次与前面的元素比较,找到第一个小于第 i 个元素的位置。

  3. 找到合适的位置后,将第 i 个元素插入到该位置,同时需要将位置之后的元素都向后移动一位。

  4. 重复步骤 1-3, 直到整个数组有序。

3.排序的优点

  1. 实现简单,编码容易。

  2. 对于部分有序的数组,直接插入排序的效率很高。

  3. 是一种稳定的排序算法,即相等元素的相对位置不会改变。

  4. 在数组规模较小时,直接插入排序的性能优于其他更复杂的排序算法。

4.排序的缺点

  1. 时间复杂度为O(n^2),在数据量较大时效率较低。

  2. 需要在数组中进行大量的数据移动操作,效率较低。

  3. 不适合于元素数量较大的数组排序。如果待排序数组基本有序,直接插入排序的效率会很高,但如果数组越乱,排序效率就会越低。

  4. 无法利用cpu的缓存机制,对于大规模数据排序,其性能会明显低于其他排序算法。

5.直接插入排序的功能

  1. 将无序数组或部分有序数组排列成升序序列。

  2. 维护数组中元素的相对顺序,即相等元素的相对位置不会改变。这使得直接插入排序是一种稳定的排序算法。

  3. 适用于小规模数据的排序,当数组规模较小时它的性能比较优秀。

  4. 对于部分有序的数组,直接插入排序的效率会很高,因为需要移动的元素较少。

  5. 可以改写为降序排序,只需要在插入时改为从后向前比较并插入即可。

  6. 可以作为其他排序算法的基础,如希尔排序就是基于直接插入排序改进而来的。

二.直接插入排序的代码实现

                              

void insertionSort(int arr[], int n) {int i, j, key;for (i = 1; i < n; 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;}
}

1.直接插入排序算法的工作原理

  1. insertionSort(int arr[], int n) 函数是直接插入排序的实现。它接受一个整型数组 arr 和数组长度 n 作为参数。

  2. 外层 for 循环从下标为 1 的元素开始遍历数组。这是因为下标为 0 的元素可以认为是一个已排序的子数组。

  3. 在每次外层循环迭代中:

    • 将当前元素 arr[i] 保存到变量 key 中。
    • 将当前元素的前一个下标 i-1 赋给变量 j。这个变量用于在已排序的子数组中找到 key 的插入位置。
  4. 内层 while 循环用于在已排序的子数组中找到 key 的插入位置。循环条件是 j >= 0 && arr[j] > key,即只要 j 不越界且 arr[j] 大于 key,就一直执行循环体。

  5. 在内层循环中:

    • 将 arr[j] 向后移动一位,赋值给 arr[j+1]。这相当于为 key 腾出一个位置。
    • 将 j 减1,继续向前检查已排序的子数组。
  6. 当内层循环结束时,也就找到了 key 的合适插入位置 j+1。此时将 key 赋值给 arr[j+1],完成了插入操作。

  7. main() 函数中创建了一个示例数组 arr,并调用 insertionSort() 函数对其进行排序。

  8. 最后,分别打印排序前后的数组。

2.算法的工作过程

  1. 将数组分为已排序和未排序两部分。
  2. 每次从未排序部分取出一个元素 key
  3. 在已排序部分中找到 key 的合适插入位置。
  4. 将 key 插入到找到的位置,完成一次插入排序。
  5. 重复步骤2-4,直到整个数组有序。

三.直接插入排序的源代码

1.insertionSort(int arr[], int n) 函数

  • 接受一个整型数组 arr 和数组长度 n 作为输入参数。
  • 实现直接插入排序算法,将数组 arr 按升序排列。

2.算法步骤

  • 从数组的第二个元素开始遍历 (i = 1n-1).
  • 对于当前元素 arr[i], 将其保存在变量 key 中.
  • 设置一个指针 j 指向当前元素的前一个位置 (j = i-1).
  • 从 j 开始向前遍历已排序子数组, 将大于 key 的元素都向后移动一位 (while (j >= 0 && arr[j] > key)).
  • 找到 key 的正确插入位置后, 将 key 插入到该位置 (arr[j+1] = key).

3.main() 函数

  • 定义一个整型数组 arr 并计算其长度 n.
  • 打印原始数组.
  • 调用 insertionSort() 函数对数组进行排序.
  • 打印排序后的数组.

通过这段代码,我们可以看到直接插入排序的具体实现过程。它将数组分为已排序和未排序两部分,并且每次从未排序部分取出一个元素,找到它在已排序部分的正确位置并插入。这种简单高效的排序方法在小规模数据和部分有序数组中表现出色。

#include <stdio.h>void insertionSort(int arr[], int n) {int i, j, key;for (i = 1; i < n; 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;}
}int main() {int arr[] = {64, 25, 12, 22, 11};int n = sizeof(arr) / sizeof(arr[0]);printf("原始数组: ");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");insertionSort(arr, n);printf("排序后的数组: ");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

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

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

相关文章

前端开发的设计思路【精炼】(含数据结构设计、组件设计)

数据结构设计 用数据描述所有的内容数据要结构化&#xff0c;易于程序操作(遍历、查找)&#xff0c;比如数组、对象、对象为元素构成的数组&#xff08;每个元素记得设置唯一的 id 属性&#xff0c;以便对元素进行删改操作&#xff09;数据要可扩展&#xff0c;以便增加新的功能…

力扣 42. 接雨水 python AC

双指针 class Solution:def trap(self, heights):l, r 0, len(heights) - 1maxl, maxr 0, 0ans 0while l < r:maxl, maxr max(maxl, heights[l]), max(maxr, heights[r])if maxl < maxr:ans maxl - heights[l]l 1else:ans maxr - heights[r]r - 1return ans单调栈…

清除微信小程序默认button样式

button {background-color: transparent;border: none;color: inherit;font: inherit;line-height: normal;overflow: visible;outline: none;cursor: pointer;padding: 0;margin: 0; }button::after {border: none; }.button-hover {background-color: transparent; }

设置 border 边框单侧样式 - HarmonyOSNext

设置 border 边框单侧样式,通过 api 中查看 border(value: BorderOptions): T; BorderOptions 又包含了若干个子属性 1.width?: EdgeWidths | Length; 2.color?: EdgeColors | ResourceColor; 3.radius?: BorderRadiuses | Length; 4.style?: EdgeStyles | BorderStyle; 其…

Java 为什么使用泛型

目录 概述 1. 如下我们需要不同对象打印内容 2. 这时候就可以引入泛型使用 3. 泛型和Object的区别 概述 Java泛型&#xff08;Generics&#xff09;是JDK5.0引入的一种特性&#xff0c;它允许程序员在定义类、接口和方法时使用类型参数&#xff08;type parameters&#…

MYSQL框架结构

MYSQL框架结构 通过解析器和预处理生成解析树&#xff0c;预处理判断是否合法&#xff0c;如果合法则调用优化器去进行优化。

World Creator v2.1.0 解锁版安装教程 (GPU三维地形生成软件)

前言 World Creator是一款功能相当强大的地形景观生成器&#xff1b;可以完全根据自己的需求来对地形、景观生成您需要三维模型&#xff0c;内置的大量预设&#xff0c;让您的创建拥有无限的可能性。 一、下载地址 下载链接&#xff1a;http://dygod/ITSource 点击搜索&…

蓝卓入选工信部2023年度“揭榜挂帅”项目

蓝卓“面向多元异构和应用快速开发演化的智能工厂操作系统解决方案”&#xff0c;凭借行业领先的平台技术能力以及数智赋能的硬核实力成功揭榜挂帅。 本次入选不仅代表了蓝卓又一次获得工信部权威专家及国家认可&#xff0c;更是“工厂操作系统”首次在国家层面获得表彰。 智能…

【JS】async/await异常捕获,这样做才完美

前言 &#x1f34a;缘由 JS中async/await异步调用&#xff0c;只能通过try-catch吗&#xff1f; &#x1f34d;你想听的故事&#xff1a; 作为一个合格的全栈搬砖工&#xff0c;那必须文武双全&#xff0c;前后必备。遂吾日三省吾身&#xff0c;偶发觉前端长时间不写有些落下…

png格式到oas/gds格式之间的转换方法

想咨询一下万能的CSDN圈: 是否有1-2步,从png格式到oas/gds格式的转换方法. 检索了不少参考资料,需要从png->二值化图像->cif图像->gds格式->oas格式. 这样导出的结果,大概是图像损失极大,当然还没有尝试. 所以想咨询了一下,有偿

宝塔Nginx设置图片访问跨域

宝塔Nginx设置图片访问跨域 针对某一个站点设置 找到对应的站点点击 “设置” 增加对应header设置 代码&#xff1a; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${#允许跨域add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Headers X-Requeste…

【NumPy】关于numpy.subtract()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

【全开源】活动报名表单系统(ThinkPHP+Uniapp+uView)

轻松构建高效报名平台 一、引言 随着线上活动的日益增多&#xff0c;一个高效、易用的活动报名表单系统成为了举办各类活动的必备工具。为了满足不同组织和个人的需求&#xff0c;我们推出了功能强大的“活动报名表单系统源码”。本文将为您详细介绍该源码的特点、功能以及使…

【UE数字孪生学习笔记】 使用DataSmith对模型快速导入 UE5.3.2使用unreal DataSmith文件

声明&#xff1a;部分内容来自于b站&#xff0c;慕课&#xff0c;公开课等的课件&#xff0c;仅供学习使用。如有问题&#xff0c;请联系删除。 部分内容来自UE官方文档&#xff0c;博客等 UE5.3.2使用 3D Max 导出的unreal DataSmith文件 1. 去UE官网下载DataSmith导出器并导…

【Linux】中常见的重要指令(下)以及重要的几个热键

目录 一、时间相关的指令date 1.时间戳 二、Cal指令 三、find指令 1.whereis 2.which 四、grep指令 五、zip和unzip指令 六、tar指令 七、bc指令 八、.重要的几个热键[Tab]&#xff0c;[ctrl]-c&#xff0c;[ctrl]-d 一、时间相关的指令date date 指定格式显示时间…

【Redis精通之路】数据类型(2)

目录 1 Strings 1.1 字符串作为计数器 1.2 限制 1.3 按位运算 1.4 性能 1.5 其他方案 2 JSON 2.1 主要功能 2.2 使用方法 2.3 格式化CLI输出 2.4 启动Redis 2.4.1 Docker 2.4.2 二进制文件 2.4.3 源代码构建 2.4.4 将模块加载到Redis 2.5 限制 2.6 索引 2.7 …

极致优化之道-JVM字节码调优全揭秘

作为Java开发者&#xff0c;我们都渴望能写出高效、流畅的程序。然而性能瓶颈往往来自于意料之外的地方。今天我们将一同揭开JVM字节码调优的神秘面纱&#xff0c;探索通过字节码优化来提升Java程序运行性能的独门秘笈。跟随我一同踏上这条编码优化之路&#xff0c;开启高性能编…

ROM的简单实现

描述 实现一个深度为8&#xff0c;位宽为4bit的ROM&#xff0c;数据初始化为0&#xff0c;2&#xff0c;4&#xff0c;6&#xff0c;8&#xff0c;10&#xff0c;12&#xff0c;14。可以通过输入地址addr&#xff0c;输出相应的数据data。 接口信号图如下&#xff1a; 使用Veri…

Esp32+阿里云物联网平台+DHT11+控制LED(基于PubSubClient库)

Esp32阿里云物联网平台DHT11控制LED 关于本文&#xff1a;利用ESP32连接DHT11温湿度传感器获取温湿度&#xff0c;上报到阿里云物联网平台&#xff0c;通过阿里云物联网平台实时远程查看温湿度&#xff0c;并且接收平台下发的LED灯控制指令。要注意的是&#xff0c;阿里云有两…

【动态规划】零基础解决路径问题(C++)

目录 62.路径问题 解法&#xff08;动态规划&#xff09;&#xff1a; 1. 状态表⽰&#xff1a; 2. 状态转移⽅程&#xff1a; 3. 初始化&#xff1a; 4. 填表顺序&#xff1a; 5. 返回值&#xff1a; 不同路径2.0 解法&#xff08;动态规划&#xff09;&#xff1a; …