插入排序——表插入排序

目录

1、简述

2、复杂程度

3、稳定性

4、实例


1、简述

表插入排序(Table Insertion Sort)是一种基于插入排序的排序算法,它通过维护一个已排序的索引表来加速插入操作。在标准插入排序中,每次插入一个新元素时,需要在已排序数组中找到合适的位置并进行元素移动。而在表插入排序中,通过构建一个索引表,可以直接找到元素应该插入的位置,从而减少实际元素移动的次数。

实现步骤:

  • 初 始化索引表:创建一个与待排序数组等长的索引表,初始时将索引按自然顺序(0, 1, 2, ..., n-1)排列。
  • 构建索引表: 
    •  从待排序数组的第二个元素开始,依次将每个元素插入到已排序的索引表中。
    •  找到当前元素在已排序索引表中的正确位置,并将索引插入。
  • 调整索引表:插入新元素时,调整索引表中后续元素的位置以保持有序。
  • 根据索引表重 排数组:根据排序后的索引表重新排列原数组中的元素。

2、复杂程度

  • 时间复杂度:
    • 平均时间复杂度:O(n^2),因为在插入每个元素时,可能需要扫描已排序部分的所有元素来找到插入位置。
    • 最坏时间复杂度:O(n^2),当数组是逆序时,插入每个元素都需要移动前面所有的元素。
    • 最好时间复杂度:O(n),当数组已经有序时,只需要进行一次线性扫描。
  • 空间复杂度:
    • O(n),需要额外的空间来存储索引表。

3、稳定性

表插入排序是一种稳定的排序算法,因为在插入元素时,即使有相等的元素,索引表中的顺序也能保证其相对位置不变。

4、实例

#include <iostream>
#include <vector>// 链表节点类
struct ListNode {int index;ListNode* next;ListNode(int idx) : index(idx), next(nullptr) {}
};// 链表类
class LinkedList {
public:LinkedList() : head(nullptr) {}// 在链表中按顺序插入新的索引void insertSorted(int index, const std::vector<int>& arr) {ListNode* newNode = new ListNode(index);if (!head || arr[head->index] >= arr[index]) {newNode->next = head;head = newNode;} else {ListNode* current = head;while (current->next && arr[current->next->index] < arr[index]) {current = current->next;}newNode->next = current->next;current->next = newNode;}}// 返回链表头指针ListNode* getHead() const {return head;}private:ListNode* head;
};// 表插入排序函数
std::vector<int> tableInsertionSort(const std::vector<int>& arr) {int n = arr.size();LinkedList sortedList;// 将每个元素索引插入到链表中for (int i = 0; i < n; ++i) {sortedList.insertSorted(i, arr);}// 根据排序后的链表重排数组std::vector<int> sortedArr;ListNode* current = sortedList.getHead();while (current) {sortedArr.push_back(arr[current->index]);current = current->next;}return sortedArr;
}// 测试代码
int main() {std::vector<int> array = {3, 1, 4, 1, 5, 9, 2, 6, 5};std::vector<int> sortedArray = tableInsertionSort(array);for (int num : sortedArray) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

 快捷跳转: 

  • 排序算法概述

生命不息,学习不止,若有不正确的地方,欢迎指正。

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

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

相关文章

vs2019 c++20 规范的头文件 <future> 源码注释和几个结论

&#xff08;1 探讨一&#xff09;在多线程中&#xff0c;需要线程返回值的可以用该头文件中的类。该头文件中模板类和模板函数定义很多&#xff0c;用一幅图给出模板类之间的关系&#xff0c;方便从整体上把握和记忆&#xff1a; &#xff08;2&#xff09;

6.5 作业

设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数。 #include <iostream>using namespace std; class Stu { privat…

WebScoket scope类型

每个 WebSocket 会话都有一个属性map。该map作为标头附加到入站客户端消息&#xff0c;并且可以从控制器方法访问它&#xff0c;如以下示例所示&#xff1a; Controller public class MyController {MessageMapping("/action")public void handle(SimpMessageHeader…

GNN与Transformer创新结合!模型性能起飞!

前言 近年来&#xff0c;图神经网络&#xff08;GNN&#xff09;和Transformer模型分别凭借其独到的优势&#xff0c;在处理复杂数据结构和识别序列间的相互依赖性方面取得了突破性进展&#xff0c;这些优势使得GNN和Transformer的结合成为图表示学习领域的一个有前景的研究方…

注解 - @RequestMapping

日期: 2024年6月5日 注解简介 在今天的每日一注解中&#xff0c;我们将探讨RequestMapping注解。RequestMapping是Spring框架中的一个注解&#xff0c;用于映射HTTP请求到处理器方法或控制器类。 注解定义 RequestMapping注解可以用于类和方法上&#xff0c;以指定URL路径和H…

IP黑名单与IP白名单是什么?

在IP代理使用中&#xff0c;我们经常听到黑名单与白名单两个名词&#xff0c;它们不仅提供了强大的防御机制&#xff0c;还可以灵活应对不同的安全威胁。本文将详细探讨IP黑名单和白名单在网络安全中的双重屏障作用。 一、IP黑名单和白名单定义 IP黑名单与IP白名单是网络安全中…

Android 15?我想躺着

大家好,最近行业形势越来越差,希望大家安好吧。 之前写过一些 Android 版本的适配: 安卓11来了,快!扶我起来安卓13来了,快!扶起我来!Android 14 又来了?别扶!抬起我来吧!今年继续,这对于自己来说也算是一个小的任务或者说传统吧。 同样,本篇文章也会从以下几个点…

区块链游戏(链游)安全防御:抵御攻击的策略与实践

一、引言 区块链游戏&#xff0c;或称为链游&#xff0c;近年来随着区块链技术的普及而迅速崛起。然而&#xff0c;如同其他任何在线平台一样&#xff0c;链游也面临着各种安全威胁。本文将探讨链游可能遭遇的攻击类型以及如何通过有效的策略和技术手段进行防御。 二、链游可…

小孩天赋是怎样炼成的 懂孩子比爱孩子更重要 详细天赋评估列表 观察非常细致 培养领导能力的方法

懂孩子比爱孩子更重要 “懂孩子比爱孩子更重要&#xff0c;懂才更准确的去爱” 这句话说得很有道理。理解孩子的内心世界、需求和独特个性&#xff0c;比单纯地给予爱更加重要。以下是一些解释&#xff1a; 理解孩子的需要&#xff1a;懂孩子意味着理解他们的需求、恐惧、欢乐…

动软代码生成器

目前代码生成器好久没有更新了&#xff0c;今天下载变成电影频道了&#xff08;掉泪&#xff09;&#xff1b;这里做个记录&#xff1b; 目前我使用该软件主要是使用数据表》代码功能&#xff1b;自己创建模板&#xff0c;生成前后台代码&#xff1b;前台主要是vue3.0&#xff…

大模型时代的具身智能系列专题(十)

Sergey Levine团队 Sergey Levine目前是UC Berkeley电气工程与计算机科学系的副教授&#xff0c;同时是RAIL(Robotic AI&Learning LabBAIR)实验室主任。除了在Berkeley的教职&#xff0c;Levine也是Google Brain的研究员&#xff0c;他也参与了Google知名的机器人大模型PA…

数据仓库之核心模型与扩展模型分离

在数据仓库的设计和实施过程中&#xff0c;核心模型与扩展模型分离是一种常见的策略&#xff0c;旨在提高数据仓库的灵活性、可维护性和扩展性。这种分离策略的主要优势和实施方法如下&#xff1a; 核心模型&#xff08;Core Model&#xff09; 核心模型是数据仓库中稳定、共…

C#——随机类Random类

Random类 C#的Random类是用于生成随机数的类&#xff0c;属于System命名空间&#xff0c;可以生成各种类型的随机数&#xff0c;例如整型、双精度浮点型、布尔型等。 使用方法&#xff1a; 使用random数据类型关键字 声明一个random的变量 值使用new random 来实例化这个变量…

使用python绘制日历热力图

使用python绘制日历热力图 日历热力图效果代码 日历热力图 日历热力图&#xff08;Calendar Heatmap&#xff09;是一种数据可视化图表&#xff0c;用于展示时间数据的分布和趋势。它将数据按天映射到一个日历中&#xff0c;通过颜色的变化表示每天的数据值大小。这种图表常用…

Lua 时间工具类

目录 一、前言 二、函数介绍 1.DayOfWeek 枚举定义 2.GetTimeUntilNextTarget 3.GetSpecificWeekdayTime 三、完整代码 四、总结 一、前言 当我们编写代码时&#xff0c;我们经常会遇到需要处理日期和时间的情况。为了更方便地处理这些需求&#xff0c;我们可以创建一个…

基于GFlowNets的蚁群抽样组合优化

本文将基于GFACS论文&#xff0c;探讨其核心思想、技术细节以及在实际应用中的优势。 GFlowNet&#xff1a;摊销MCMC成本的有效工具 GFACS的核心是GFlowNet&#xff0c;它通过训练学习状态转移的概率分布&#xff0c;从而替代传统的MCMC采样方法。GFlowNet的优势在于&#xff1…

从Series到DataFrame:Python数据操作的转换技巧

在数据分析和处理的过程中&#xff0c;我们经常需要在Pandas库中对Series和DataFrame进行操作。本文将介绍如何将Series转换为DataFrame&#xff0c;以及如何提取DataFrame中的某一列。首先&#xff0c;我们将通过使用to_frame()函数将Series转换为DataFrame。然后&#xff0c;…

去雾算法中生成器,判别器有什么用

生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;是生成对抗网络&#xff08;Generative Adversarial Networks, GANs&#xff09;中的两个核心组件&#xff0c;它们在网络中扮演着相互竞争和相互促进的角色。下面分别解释它们的作用&am…

SQL实验 连接查询和嵌套查询

一、实验目的 1&#xff0e;掌握Management Studio的使用。 2&#xff0e;掌握SQL中连接查询和嵌套查询的使用。 二、实验内容及要求&#xff08;请同学们尝试每道题使用连接和嵌套两种方式来进行查询&#xff0c;如果可以的话&#xff09; 1&#xff0e;找出所有任教“数据…

ubuntu使用Docker笔记

一、参考资料 1、B站视频 尚硅谷Docker实战教程 2、有心人整理的笔记 Docker笔记&#xff08;周阳版&#xff09; 3、菜鸟教程 Docker 教程 以下是本人的折腾实践。 二、Docker的安装 2.1、使用清华源安装docker&#xff0c;清华源官方教程。 本人是在ubuntu20.04下安装的…