常见排序算法之插入排序

embedded/2024/9/22 23:50:24/

目录

一、直接插入排序

1.1 什么是插入排序

1.2 代码思路

1.3 C语言源码

二、希尔排序

2.0 插入排序的弊端

2.1 什么是希尔排序?

2.2 排序思路

2.3 C语言源码


一、直接插入排序

1.1 什么是插入排序

插入排序是一种简单直观的排序算法,它通过构建有序序列,对未排序数据逐个插入到合适的位置,从而达到排序的目的。

具体操作为:将第一个元素视为已排序部分,然后依次将后面的元素插入到已排序部分,直到所有元素都插入完成为止。

插入排序的时间复杂度为O(N^2),是一种稳定的排序算法

1.2 代码思路

采取先部分后整体的思路进行讲解

  • 部分
  1. 假设前n个元素均为已排序好的元素,已排序好的最后一个元素的数组下标为end
  2. 将end+1下标对应的值与end对应的值进行比较
    如果大于前一个值,则在end+1的位置插入该值。
    如果小于前一个值,则在end-1的位置插入该值。
  3. 循环比较已经排序好的元素的值与end+1的值,重复插入操作。
    在比较有限次后若发现满足条件,则跳出循环。
    考虑最坏的情况,如果end-1为0时,也就是插入到了数组的第一个位置,则跳出循环。
  • 整体
  1. 从n=0开始循环,假设循环i次,那么每次已排序好的数组最后一个下标就是数组的大小-i
  2. 关键问题是要进行多少次循环?

1.3 C语言源码

void InsertSort(int* a, int n)
{for (int i = 0; i < n-1; i++){int end = i;int tmp = a[end + 1];while (end >= 0){if (a[end] > a[end + 1]){a[end + 1] = a[end];end--;}else{break;}a[end + 1] = tmp;}}
}

二、希尔排序

2.0 插入排序的弊端

插入排序的主要弊端在于其时间复杂度较高。在最坏情况下,插入排序的时间复杂度为O(n^2),因此对于大规模数据集合来说,插入排序的效率较低。尤其是当数组是升序排序时,想要转成降序排序,效率极低。

由此衍生出希尔排序。通过引入增量序列,将整个数据集合分成多个子序列,并对每个子序列进行插入排序,逐渐减小增量,最终实现对整个数据集合的排序。这样做减少了数据的搬移次数,提高了排序的效率。希尔排序通过这种分组的方式,使得较小的元素可以更快地移动到合适的位置,从而减少了插入排序中的反复比较和移动操作,提高了排序效率。

2.1 什么是希尔排序?

希尔排序是一种基于插入排序的排序算法,也被称为“缩小增量排序”。它的基本思想是将待排序的元素分成若干个小组,对每个小组进行插入排序;然后逐渐减小每组的元素个数,继续进行插入排序,直到每组只有一个元素为止。通过这种分组和逐渐减小增量的方式,希尔排序可以在一定程度上减少插入排序的移动操作次数,从而提高排序效率。

2.2 排序思路

采取先部分后整体的思路进行讲解

  • 部分
  1. 设置分组的间隔 gap。
  2. 将每个组看作一个新的数组进行插入排序。
  3. 插入排序的数组下标以及循环结束的条件需要改变,见下图解
  • 整体
  1. 重新设置分组的间隔gap,缩小组数,重复插入排序操作。
  2. 直至gap为1,对整体进行一次插入排序,则最终完成了对数组的排序。
  3. 关于gap的取值选择,目前尚无定论。取gap = gap / 3+1为例
    摘自《数据结构-用面向对象方法与C++描述》-殷人昆
     

2.3 C语言源码

void ShellSort(int* a, int n)
{int gap = n;//总逻辑while (gap > 1){gap = gap / 3 + 1;//多组排序逻辑for (int j = 0; j < gap; j++){//一组排序逻辑for (int i = 0; i < n - gap; i++){int end = i;int tmp = a[end + gap];while (end >= 0){if (a[end] > tmp){a[end + gap] = a[end];end -= gap;}else{break;}a[end + gap] = tmp;}}}}
}


http://www.ppmy.cn/embedded/43646.html

相关文章

图像上下文学习|多模态基础模型中的多镜头情境学习

【原文】众所周知&#xff0c;大型语言模型在小样本上下文学习&#xff08;ICL&#xff09;方面非常有效。多模态基础模型的最新进展实现了前所未有的长上下文窗口&#xff0c;为探索其执行 ICL 的能力提供了机会&#xff0c;并提供了更多演示示例。在这项工作中&#xff0c;我…

elasticdump和ESM

逐个执行如下命令&#xff1b; 1.拷贝analyzer如分词&#xff08;需要分词器&#xff0c;可能不成功&#xff0c;不影响复制&#xff09; ./elasticdump --inputhttp://[来源IP地址]:9200/[来源索引] --outputhttp://[目标IP地址]:9200/[目标索引] --typeanalyzer 2.拷贝映射…

unity 制作app实现底部导航栏和顶部状态栏

前段时间在用unity制作一个app&#xff0c;发现有个问题用unity制作的app&#xff0c;他默认是没有顶部状态栏的&#xff0c;也没有底部的导航栏&#xff0c;是一个全部覆盖的状态。但仔细观察可以发现&#xff0c;正常app&#xff0c;顶部状态栏是有的&#xff0c;而且是透明的…

HBase安装

安装HBase 提示&#xff1a;需要安装好hadoop和zookeeper 安装zookeeper可参考 一、确定HBase版本 去网站确认 https://hbase.apache.org/book.html#hadoop二、下载HBase安装包 去清华大学镜像站下载 https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/三、安装HBase …

Java | Leetcode Java题解之第103题二叉树的锯齿形层序遍历

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> zigzagLevelOrder(TreeNode root) {List<List<Integer>> ans new LinkedList<List<Integer>>();if (root null) {return ans;}Queue<TreeNode> n…

HCIP的学习(24)

第七章&#xff0c;VLAN—虚拟局域网 ​ 通过在交换机上部署VLAN技术&#xff0c;将一个规模较大的广播域在逻辑上划分成若干个不同的、规模较小的广播域。 ​ IEEE 802.1Q标准----虚拟桥接局域网标准----Dot1Q标准 标签协议标识符&#xff1a;0x8011&#xff08;代表数据帧是8…

BookxNote Pro 宝藏 PDF 笔记软件

一、简介 1、BookxNote Pro 是一款专为电子书阅读和学习笔记设计的软件&#xff0c;支持多种电子书格式&#xff0c;如PDF和EPUB&#xff0c;能够帮助用户高效地管理和阅读电子书籍&#xff0c;同时具备强大的笔记功能&#xff0c;允许用户对书籍内容进行标注、摘录和思维导图绘…

短道速滑短视频:四川京之华锦信息技术公司

短道速滑短视频&#xff1a;冰雪激情的视觉盛宴 随着冬奥会的热度不断攀升&#xff0c;短道速滑作为其中一项紧张刺激、充满观赏性的运动&#xff0c;受到了越来越多人的关注。而在社交媒体和短视频平台的助力下&#xff0c;短道速滑短视频成为了人们了解、欣赏这项运动的新窗…