【算法】插入排序 与 希尔排序 概念+图解+代码【Python C C++】

1.插入排序

1.1概念

插入排序(InsertionSort),一般也被称为直接插入排序。

对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序方法,它的基本思想是将一个元素插入到已经排好序的有序表中,从而构造出一个新的、记录数增 1 的有序表。

并假设最开始该有序列表只有第一个元素,将后面的每个元素按顺序依次插入到前面有序列表的合适位置中去即可。

在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。

时间复杂度:O(n^2)

空间复杂度: O(1)

1.2图解(以C语言代码为例)

1.3代码

1.3.1 C

#include <stdio.h>void insertionSort(int arr[], int n);  // 声明插入排序函数
void printArray(int arr[], int size);  // 声明打印数组函数int main() {int arr[] = {12, 11, 13, 5, 6};  // 定义待排序数组int n = sizeof(arr)/sizeof(arr[0]);  // 计算数组长度insertionSort(arr, n);  // 调用插入排序函数printf("Sorted array: \n");  // 打印排序后的数组printArray(arr, n);return 0;  // 程序结束
}void insertionSort(int arr[], int n) {int i, key, j;  // 定义局部变量for (i = 1; i < n; i++) {  // 从第二个元素开始遍历key = arr[i];  // 将当前元素保存为keyj = i - 1;  // 设置j为前一个元素的索引// 移动比key大的元素while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];  // 将元素向右移动j = j - 1;  // 移动到下一个元素}arr[j + 1] = key;  // 将key插入到正确的位置}
}void printArray(int arr[], int size) {int i;  // 定义索引变量for (i = 0; i < size; i++)  // 遍历数组printf("%d ", arr[i]);  // 打印每个元素printf("\n");  // 换行
}

1.3.2 Python

def insertionSort(x):for i in range(1, len(x)):temp = x[i]j = i - 1while j >= 0 and x[j] > temp:x[j+1] = x[j]j -= 1x[j + 1] = tempx1 = [2, 5, 2, 1, 9, 4, 7]
print(x1)
insertionSort(x1)
print(x1)# 输出
[2, 5, 2, 1, 9, 4, 7]
[1, 2, 2, 4, 5, 7, 9]

1.3.3 C++

#include <iostream>// 插入排序函数
void insertionSort(int arr[], int n) {for (int i = 1; i < n; i++) {  // 从第二个元素开始,到数组末尾int key = arr[i];  // 保存当前要插入的元素int j = i - 1;  // 初始化一个指针,指向当前元素的前一个位置// 当 j 大于等于 0 且前一个元素大于当前元素时while (j >= 0 && arr[j] > key) {  arr[j + 1] = arr[j];  // 将前一个元素向后移动一位j = j - 1;  // 将 j 向前移动一位}arr[j + 1] = key;  // 将当前元素插入到正确的位置}
}// 打印数组函数
void printArray(int arr[], int size) {for (int i = 0; i < size; i++)std::cout << arr[i] << " ";std::cout << std::endl;
}// 测试案例
int main() {int arr[] = {12, 11, 13, 5, 6};int n = sizeof(arr) / sizeof(arr[0]);std::cout << "排序前的数组为: ";printArray(arr, n);insertionSort(arr, n);std::cout << "排序后的数组为: ";printArray(arr, n);return 0;
}

2.希尔排序

2.1 概念

希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进

希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名。

它通过比较相距一定间隔的元素来进行,通过确定分隔间隔(总数除2取整,再递归除2,直到为1)来分出多个数列分别进行从少到多插入排序,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止

时间复杂度:O(n^(1.3-2))

没有时间复杂度为 O(n(logn)) 的快速排序算法快 ,因此对中等大小规模表现良好,但对规模非常大的数据排序不是最优选择,

比一般 O(n^2 ) 复杂度的算法快得多

空间复杂度: O(1)

可能有人会觉得,希尔排序的最后一步不就相当于插入排序,一个一个加到有序列表中去

但其实希尔排序通过先将数组按照较大的间隔进行分组排序,使得数组在一开始就变得部分有序。随着间隔逐渐缩小,最终达到类似于插入排序的效果。虽然希尔排序的最后一步在较小间隔时类似于插入排序,但由于前面的分组排序操作,使得元素的初始顺序相对较好,减少了插入排序时元素移动的次数。插入排序在最坏情况下,对于一个逆序的数组,每次插入操作都需要移动大量的元素,时间复杂度为 O(n^2)。而希尔排序通过合理选择间隔序列,可以在大多数情况下,有效地减少排序的总比较和移动次数,不过对于希尔排序最坏的情况也是O(n^2),只能说大部分情况下比插入排序优。

2.2 图解(以C语言代码为例)

2.3代码

2.3.1 C 

//gcc -g D:\C\the_C\算法知识相关\希尔排序\2.c -o D:\C\the_C\算法知识相关\希尔排序\b.exe
#include <stdio.h>// 希尔排序函数
void shellSort(int arr[], int n) {int gap, i, j, temp;for (gap = n / 2; gap > 0; gap = gap / 2) {for (i = gap; i < n; i++) {temp = arr[i];for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {arr[j] = arr[j - gap];}arr[j] = temp;}}
}// 打印数组函数
void printArray(int arr[], int size) {int i;for (i = 0; i < size; i++)printf("%d ", arr[i]);printf("\n");
}// 测试案例
int main() {int arr[] = {12, 11, 13, 5, 6};int n = sizeof(arr) / sizeof(arr[0]);printf("before sorting: ");printArray(arr, n);shellSort(arr, n);printf("after sorting: ");printArray(arr, n);return 0;
}

2.3.2 python

def ShellSort(x):gap = len(x) // 2while gap >= 1:i = gapwhile i < len(x):temp = x[i]j = i - gapwhile j >= 0 and x[j] > temp:x[j + gap] = x[j]j -= gapx[j + gap] = tempi += 1gap //= 2x1 = [2, 5, 2, 1, 9, 4, 7]
print(x1)
ShellSort(x1)
print(x1)# 输出
[2, 5, 2, 1, 9, 4, 7]
[1, 2, 2, 4, 5, 7, 9]

2.3.3 C++

#include <iostream>// 希尔排序函数
void shellSort(int arr[], int n) {for (int gap = n / 2; gap > 0; gap /= 2) {for (int i = gap; i < n; i++) {int temp = arr[i];int j;for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {arr[j] = arr[j - gap];}arr[j] = temp;}}
}// 打印数组函数
void printArray(int arr[], int size) {for (int i = 0; i < size; i++) {std::cout << arr[i] << " ";}std::cout << std::endl;
}// 测试示例
int main() {int arr[] = {12, 11, 13, 5, 6};int n = sizeof(arr) / sizeof(arr[0]);std::cout << "排序前的数组为: ";printArray(arr, n);shellSort(arr, n);std::cout << "排序后的数组为: ";printArray(arr, n);return 0;
}

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

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

相关文章

mathtype7.4永久激活码(mathtype7永久注册码网盘下载)

大家好&#xff0c;我是你们的数学小能手&#xff01;今天我要安利一款超实用的工具——MathType&#xff0c;让你在数学的世界里游刃有余&#xff0c;轻松搞定各种公式和计算。准备好被种草了吗&#xff1f;跟我一起来瞧瞧吧&#xff01; MathType是理科生专用的必备工具&…

鸿蒙9+在TV端焦点封装控制

鸿蒙9 目前不支持鸿蒙系统电视&#xff0c;但是往后肯定是必须会支持的&#xff0c;所以直接学arkts就完事了&#xff0c;目前的api9对焦点控制还是不够直接简洁&#xff0c;估计还在完善中&#xff0c;但是可以通过自定义component来实现一下 首先踩坑&#xff1a; Row官方说…

EXCEL 排名(RANK,COUNTIFS)

1.单列排序 需求描述&#xff1a;如有下面表格&#xff0c;需要按笔试成绩整体排名。 解决步骤&#xff1a; 我们使用RANK函数即可实现单列整体排名。 Number 选择第一列。 Ref 选择这一整列&#xff08;CtrlShift向下箭头、再按F4&#xff09;。 "确定"即可计算…

一键解锁百变发型!上交联合Tiamat震撼发布Stable-Hair发型移植黑科技!

Stable-Hair 是一种基于扩散的新型发型转移方法&#xff0c;可以稳健地转移各种现实世界的发型。在各种具有挑战性的发型上实现了高度详细和高保真度的转移&#xff0c;效果令人印象深刻&#xff0c;同时保留了原始身份内容和结构。 相关链接 论文链接: https://arxiv.org/pdf…

【SpringBoot】URL映射之consumes和produces匹配、params和header匹配

4.2.3 consumes和produces匹配 //处理request Content-Type为"application/json"类型的请求 RequestMapping(value"/Content",methodRequestMethod.POST,consumes"application/json") public String Consumes(RequestBody Map param){ return…

windows远程免密码登陆

1、按下WindowsR,打开运行窗口&#xff0c;输入gpedit.msc 2、依次选择计算机设置-- Windows 设置--安全设置--本地策略--安全选项 3、双击进入--帐户&#xff1a;使用空白密码的本地帐户只允许进行控制台登录 双击打开 参考 百度安全验证 Win11提示凭证不足无法访问这台打…

C++ std::vector及使用时的常见优化策略

std::vector 是 C 标准模板库&#xff08;STL&#xff09;中的一个动态数组容器。它提供了动态大小调整和高效的随机访问功能&#xff0c;非常适合需要频繁插入、删除和访问元素的场景。std::vector 是在 <vector> 头文件中定义的&#xff0c;并且位于 std 命名空间中。 …

案例实践 | 基于长安链的福建省气象综合治理区块链平台

案例名称-【福建省气象综合治理区块链平台】 ■ 实施单位 福建福链科技有限公司 ■ 业主单位 福建省气象信息中心 ■ 上线时间 2023年10月 ■ 用户群体 福建省气象、防灾减灾相关单位 ■ 用户规模 全省2100余个气象站、气象局以及防灾减灾部门 案例背景与解决痛点 …

跟代码执行流程,读Megatron源码(四)megatron初始化脚本initialize.py之initialize_megatron()分布式环境初始化

在前文中&#xff0c;我们讲述了pretrain函数的执行流程&#xff0c;其首要步骤是megatron分组的初始化与环境的配置。本文将深入initialize_megatron函数源码&#xff0c;剖析其初始化分布式训练环境的内部机制。 注&#xff1a;在此假设读者具备3D并行相关知识 一. initiali…

【MARL】MADDPG + attention 实现(+论文解读)

文章目录 前言注意力机制论文里的attention回顾知识-MADDPG讲解1.Q的定义2.Q的恒等式3.论文里的attention4.好处 实现 和 修改结果展示原论文代码 翻改版修改后原maddpg代码 前言 导师让在MADDPG上加一个注意力机制&#xff0c;试了很多种&#xff0c;下面的参考的论文的效果最…

C++——保持原有库头文件不变的情况下,成功编译运行工程

问&#xff1a;想要保持原来库方式&#xff0c;应该怎么操作呢&#xff1f; 答&#xff1a;如果想保持原来的方式&#xff0c;则只需要将 库所在路径 tracker/detector/rknn_model_zoo/utils 加入到 工程库包含中即可。

基于jeecgboot-vue3的Flowable流程-自定义业务表单流程历史信息显示

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、对于自定义业务表单的流程历史记录信息做了调整&#xff0c;增加显示自定义业务表单 <el-tab-pane label"表单信息" name"form"><div v-if"customF…

ESP32开发进阶:OLED屏幕显示旋转的3D模型

一、硬件接线 我选择的是最常见的一块板子&#xff1a;ESP-WROOM-32&#xff0c;硬件接线如下&#xff1a; 21 - SDA 22 - SCL 二、Arduino端代码 我们使用Arduino和Adafruit SSD1306库在OLED显示屏上绘制和旋转一个3D立方体。 首先&#xff0c;定义立方体顶点和…

国际金融入门:国际收支与平衡表解析

在全球化的经济体系中&#xff0c;国际金融已成为我们日常生活不可或缺的一部分。了解国际金融的基础知识&#xff0c;可以帮助我们更好地理解世界经济的动态和趋势。今天&#xff0c;我们将深入探讨国际收支及其平衡表&#xff0c;以及它们是如何影响国家经济。 国际收支&…

2024.07-电视版免费影视App推荐和猫影视catvod、TVBox源(最新接口地址)

文章目录 电视版免费影视App推荐精选列表&#xff08;2024.07可用筛选列表&#xff09;&#xff1a;2024.07可用筛选列表&#xff0c;盲盒资源打包合集下载安装说明真的是盲盒&#xff1f; 猫影视catvod、TVBoxTVBox源推荐可用列表目前不可用列表&#xff08;前缀为错误状态码&…

探索 Odoo 前端源码

今天我们要深入探索一段 Odoo 前端源码。这段代码看似简单,却隐藏着 Odoo 应用高效运行的秘密。我们一起来解读这段源码,了解它在 Odoo 中的作用,并教你如何正确使用它。准备好了吗?让我们开始这段奇妙之旅吧! /** @odoo-module **/import { registry } from "./cor…

CSS(七)——CSS 列表和CSS Table(表格)

目录 CSS 列表 列表 作为列表项标记的图像 列表 - 简写属性 移除默认设置 所有的CSS列表属性 CSS 表格 表格边框 折叠边框&#xff08;border-collapse&#xff09; 表格宽度和高度 表格文字对齐 表格填充 表格颜色 CSS 列表 CSS 列表属性作用如下&#xff1a; 设…

mysql 主从复制 读写分离 MHA

mysql 的主从复制和读写分离&#xff1a; 读写分离和MHA高可用的前提 主从复制 主从复制的模式&#xff1a; 1.mysql的默认模式 异步模式&#xff1a;主库在更新完事务之后会立即把结果返回给从服务器&#xff0c;不关心从库是否接收到&#xff0c;是否处理成功 网络问题可能…

大模型学习应用 1:用 itrex 创新高效实现 LLM 的部署和微调

用 itrex 创新高效实现 LLM 的部署和微调 - 项目作业 目录 准备工作Task 1 完成在线环境的工具包安装&#xff0c;包含 基础环境包、Extension for Transformers 包、加速计算包Task 2 利用 Intel Extension for Transformers 部署通义千问 Qwen-7B Chat&#xff0c;并根据 pr…

zynqmpsoc On-chip Memory

zynqmpsoc 开发手册 On-chip Memory 章节 Introduction The on-chip memory (OCM) contains 256 KB of RAM. It supports a 128-bit AXI slave interface port. The OCM has eight exclusive access monitors that can simultaneously monitor up to eight exclusive access tr…