数据结构-顺序表的插入排序

news2024/11/16 19:29:26

        顺序表的排序可以看作数组排序的拓展。基本逻辑和数组排序的逻辑大同小异。

        由于顺序表中可以存放不同种的数据类型,进而和结构体排序又有相似之处。其中要注意的是(->)和(.)的区别。

        -> 符号是针对指针进行的操作,而 . 则是针对结构体的数据进行操作。

顺序表的初始化

const int M = 505;

typedef struct{
    int key;            //关键元素
    int others;         //其他元素
}info;

typedef struct{
    info r[M+1];        
    int length();       //表长
}SeqList,*PSeqList;

 直接插入排序

        分析:

        直接插入排序是最简单的排序。本质是将顺序表中的数据依次插入新的序列并使之有序的过程。

         在这个过程中,数字88的和88的相对位置没有发生改变,所以这个排序是稳定的。

void Insert_Sort(PSeqList PL)
{
    int p;
    for(int i = 2;i <= PL->length;i++)
    {
        p = S->r[i];            //标记
        int j = i-1;
        while(PL->r[0].key < PL->r[j].key;
        {
            PL->r[j+1] = PL->r[j];
            j--;
        }
        PL->r[j+1] = p;         //插入
    }
}

        复杂度:

        空间复杂度

        在空间上只使用了一个变量 p 进行转存操作。所以空间复杂度是O(1)

        时间复杂度

        最好的情况是所有的数据已经有序,每次操作只需要把顺序表中的数据依次放入新序列即可。总的比较次数为n-1次,总的移动次数为2(n-1)次。因此时间复杂度是O(n)

        最坏的情况是所有的数据逆序排列,每次操作都需要把这次操作的数据与新序列中每一个数据进行比较。第i趟的比较次数为i+1,移动次数为i+2

        总的比较次数\sum_{i = 2}^{n}i\approx \frac{n^{2}}{2},总的移动次数\sum_{i = 2}^{n}(i+2)\approx \frac{n^{2}}{2}。因此时间复杂度是O(n^{2})

        一般情况下当处理第i个元素s_{i}时,有i个可能的插入位置。假设每个位置的可能性相同。均为1/i,比较次数为j,则平均的比较次数为\sum_{j=1}^{i}\frac{1}{i}\times j=\frac{i+1}{2}。而直接插入排序的总比较次数为\sum_{n}^{i=2}(\frac{i+1}{2})=\frac{n-1}{2}+\frac{(n-1)\times (n+2)}{2}\approx \frac{n^{2}}{4}。一般情况下平均比较次数和平均移动次数为同一数量级,所以直接插入排序的时间复杂度为O(n^{2})

二分插入排序

        分析:

        使用二分查找的思路和插入排序相结合,可以大幅度减少时间复杂度,并且是稳定的排序。

        二分查找:

        设顺序表中的结点按关键字递增,首先将待查值k和表中间位置上的结点关键字mid进行比较。若二者相等,则查找成功。否则,如果k<mid,则在表的前半部分继续利用二分查找,反之,则在表的后半部分二分查找,如此进行下去直至查找结束。

        二分查找的时间复杂度为O(\log_{2} n)

        二分插入排序代码:

void BinInsert_Sort(PSeqList PL)
{
    int l,h,mid;
    int p;
    for(int i = 2;i <= PL->length;i++)
    {
        p = PL->r[i];                    //标记
        l = 1;                           //设置区间
        h = i-1;
        while(l <= h)                    //循环查找
        {
            mid = (l+h) >> 1;
            if(PL->r[0].key >= PL->r[mid].key)
                l = mid+1;               //查找右半部分
            else    h = mid - 1;         //查找左半部分
        }
        for(int j = i-1;j >= h+1;j--)    //顺序表插入操作
            PL->r[j+1] = PL->r[j];        
        PL->r[h+1] = p;                  //插入
    }
}

        复杂度:

        空间复杂度

        与直接插入排序相同为O(1)

        时间复杂度

        与直接插入排序相比,二分插入排序的比较次数与待排序的初始状态无关,只与记录的个数有关。

        插入第i个记录时,比较次数最多为\left \lfloor log_{2}i \right \rfloor +1=\left \lceil log_{2}i \right \rceil。所以n个记录排序的总比较次数为\sum_{i=1}^{n}\left \lceil log_{2}i \right \rceil \approx n \times log_{2}n

        n较大时,显然时间复杂度比直接插入排序的最大比较次数小得多,而大于直接插入排序的最小比较数。移动次数和直接插入排序相同。所以时间复杂度为O(n^{2})

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

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

相关文章

Dubbo本地调试解决方案

有三种方式:原文链接 本文尝试使用了原作者推荐的第二种方式&#xff0c;在启动本地的服务时加入全局版本号的参数 -Ddubbo.service.versiontest同时需要修改消费者侧API的版本号。 DubboReference(version "test")private IContentPortraitService contentPortra…

MySQL字典数据库设计与实现 ---项目实战

软件准备✍&#xff1a;Mysql与Navicat可视化命令大全 ----项目实战 文章前言部分 目录 一.摘要 二.设计内容 三.项目实现 一.摘要 本项目关注于字典数据库表结构的设计和数据管理。通过现有的sql文件&#xff0c;实现system_dict_type和system_dict_data两个数据表。随后…

iptables(8)iptables自定义链

简介 我们在前文所介绍的所谓规则都是在默认链中定义的,当默认链中的规则非常多时,比如INPUT链中存放了300条规则,这300条规则有httpd服务、sshd服务的、服务的、私网IP的、公网IP的等等,那么如果我要修改某个服务的规则,例如修改sshd服务的规则,那么在这么多条规则中找到…

如何用IDEA(2024版)从github上拉取一个项目

前置要求&#xff1a; 确保你已经安装了 IntelliJ IDEA。确保你已经安装了 Git 工具并配置好了环境变量。确保你有一个 GitHub 账户&#xff0c;并且你想要克隆的仓库可以被你访问。 具体步骤&#xff1a; 1. 打开 IntelliJ IDEA 启动 IntelliJ IDEA。如果这是你第一次启动…

python tqdm显示程序运行的进度

import time from tqdm import * for i in tqdm(range(100)):if i%2 0:print("未曾清贫难为人&#xff0c;不经挫折永天真。")time.sleep(.1) #进度条每0.1s前进一次&#xff0c;总时间为1000*0.1100selse:print("回首向来萧瑟处&#xff0c;归去&#xff0…

RabbitMQ使用手册

SpringCloud微服务 什么是微服务 维基百科&#xff1a;微服务是一种软件架构风格&#xff0c;它是以专注于单一职责的很多小型项目为基础&#xff0c;组合出复杂的大型应用。 微服务拆分 拆分目标 高内聚&#xff1a;每个微服务的职责要尽量单一&#xff0c;包含的业务相互…

详解 | DigiCert EV代码签名证书

简介 DigiCert EV 代码签名证书是一种高级别的代码签名证书&#xff0c;它不仅提供了标准代码签名证书的所有安全特性&#xff0c;还增加了额外的身份验证流程&#xff0c;以确保软件开发者或发布者的身份得到最严格验证。这对于提升软件的信任度、防止恶意篡改和确保下载安全…

深入剖析Tomcat(十、十一) 详解StandardWrapper

《深入剖析Tomcat》第十章介绍了Tomcat的安全机制&#xff0c;主要就是对servlet的访问做安全验证&#xff0c;如果Tomcat中设置了某些servlet需要指定角色的用户才能访问&#xff0c;则需要客户端进行登录验证&#xff0c;如果用户名密码正确并且该用户拥有该角色的话&#xf…

Charles 显示内存不足解决方法

弹窗出现&#xff1a;Charles is running low on memory. Recording has been stopped. Please clear the session to free memory and continue recording. 官网解决方法&#xff1a; Charles runs out of memory After recording for a while Charles will run low on ava…

智能视频监控平台智能边缘分析一体机安防监控平台吸烟检测算法应用场景

智能边缘分析一体机吸烟检测算法是一种集成了先进图像处理、模式识别和深度学习技术的算法&#xff0c;专门用于实时监测和识别公共场所中的吸烟行为。以下是关于该算法的详细介绍&#xff1a; 工作原理 1、视频采集&#xff1a; 通过安装在公共场所的摄像头&#xff0c;实时…

js实现拖拽排序

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>拖拽排序</title><style>* {margin: 0;p…

成为一个NB程序员,必看的5大定律!

请把这篇文章读进脑子里去&#xff0c;且在现实中用起来 除了超有意思也真的能“镀金”~~ 顺便吆喝一声&#xff0c;如果你计算机、软件工程、电子等相关专业本科及以上学历&#xff0c;欢迎来共事。前后端/测试​均可投&#xff0c;技术大厂。 定律一&#xff1a;晕轮效应 又…

头歌——机器、深度学习——手写体识别

第1关&#xff1a;神经网络基本概念 任务描述 本关任务&#xff1a;根据本节课所学知识完成本关所设置的选择题。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.神经网络基本概念。 神经网络基本概念 神经网络由输入层、隐藏层、输出层组成&#xff1b;…

IS022000与HACCP:提升食品安全管理的完美结合

国际标准化组织&#xff08;ISO&#xff09;于2005年9月发布了IS022000:2005标准&#xff0c;这是一项针对食品安全管理体系的国际标准。我国以等同采用的方式制定了国家标准GB/T 22000-2006《食品安全管理体系食品链中各类组织的要求》&#xff08;以下简称“GB/T22000”&…

# Kafka_深入探秘者(4):kafka 主题 topic

Kafka_深入探秘者&#xff08;4&#xff09;&#xff1a;kafka 主题 topic 一、kafka 主题管理 1、kafka 创建主题 topic 命令 1&#xff09;命令&#xff1a; # 切换到 kafka 安装目录 cd /usr/local/kafka/kafka_2.12-2.8.0/# 创建一个名为 heima 的 主题 bin/kafka-topic…

Java项目:基于SSM框架实现的电子竞技管理平台【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的电子竞技管理平台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能…

最新AI智能聊天对话问答系统源码(图文搭建部署教程)+AI绘画,文生图,TTS语音识别输入,文档分析

一、人工智能语言模型和AI绘画在多个领域广泛应用 人工智能语言模型和AI绘画在多个领域都有广泛的应用。以下是一些它们的主要用处&#xff1a; 人工智能语言模型 内容生成 写作辅助&#xff1a;帮助撰写文章、博客、报告、剧本等。 代码生成&#xff1a;自动生成或补全代码&…

python项目加密和增加时间许可证

1.bat&#xff0c;执行如下的命令&#xff0c;第一句是更新或增加许可证 第二句是加密draw_face.py python offer.py pyarmor obfuscate -O dist draw_face.py绘制自制人脸.py&#xff0c;调用加密的代码draw_face代码 import sys import os import cv2# 添加加密模块所在的路…

国内顶级汽车制造厂的创新实践:如何利用实时数据湖为更多业务提供新鲜数据?

使用 TapData&#xff0c;化繁为简&#xff0c;摆脱手动搭建、维护数据管道的诸多烦扰&#xff0c;轻量代替 OGG、DSG 等同步工具&#xff0c;「CDC 流处理 数据集成」组合拳&#xff0c;加速仓内数据流转&#xff0c;帮助企业将真正具有业务价值的数据作用到实处&#xff0c…

如何在服务器之间同步文件?

业务需求 因业务需求需要在多台服务器之间做文件资源的双向同步&#xff0c;选择 ownCloud davfs2 rsync 来实现 ownCloud ownCloud 是一个开源免费专业的私有云存储项目&#xff0c;它能帮你快速在个人电脑或服务器上架设一套专属的私有云文件同步网盘。 ownCloud 能让你…