排序概念、插入排序及希尔排序

一、排序基本概念

1.就地排序:使用恒定的额外空间来产生输出

就地排序只是在原数组空间进行排序处理,也就是输入的数组和得到的数组是同一个

2.内部排序和外部排序:待排序数据可以一次性载入到内存中为内部排序,反之数据量过大就是外部排序

本科阶段几乎都是内部排序

3.稳定排序:排序前后序列中键值相等的元素在相对位置不发生变化的就是稳定排序

4.哪些排序是稳定和不稳定:

a.冒泡排序(Bubble sort),插入排序(Insrtion sort),归并排序(Merge sort)和计数排序(Counting sort)等本身就具有稳定排序的特质

b.快速排序、堆排序等是不稳定排序

c.虽然很多算法本身具有稳定或不稳定排序性质但是任何排序只要稍作修改就可以修改稳定性,例如在冒泡排序中判断交换顺序的依据是if(a>b)只要变成if(a>=b)就可以破坏稳定性

二、插入排序

特点:

1,经过几次排序后,前几个元素就已经有序了,后序元素是否有序无关

2,怕新元素是前面已经有序元素的最小值

3.如果待排序的元素,已经有序,只有极个别的元素是无序,插入速度较快

4.如果元素是链式存储,非常时候插入排序

三、代码实现

1.头文件中的接口

//
// Created by 27893 on 2025/8/9.
//#ifndef INSERTSORT_H
#define INSERTSORT_H
typedef struct {int key;void*data;
}Element;typedef struct {Element*data;int len;
}SortTable;void insertSort(SortTable*table);
#endif //INSERTSORT_H

2.算法的实现

//
// Created by 27893 on 2025/8/9.
//#include "InsertSort.h"void insertSort(SortTable *table) {//从第二个开始插入for (int i=1;i<table->len;i++) {if (table->data[i].key<table->data[i-1].key) {//用j来辅助查找元素的真正待插入位置int temp=table->data[i].key;int j=i-1;//只要待插入元素比j指向位置还小就往前while (j!=-1&&temp<table->data[j].key) {table->data[j+1].key=table->data[j].key;j--;}//否则结束插入到j的后一个位置table->data[j+1].key=temp;}}
}

四、希尔排序

1.希尔排序说明

在插入排序中,我们可能会遇到一个很小的数到很后面才发现,这样就要和前面有序区的很多元素进行比较,时间复杂度接近O(n^2)

而希尔排序是将每次步长调大一点,刚开始一般为数组长度的一半,比如下面的表元素个数为10,我们第一次排序就拿当前元素与当前元素后面的第5个进行比较,这样的比较进行5次

第二次我们步长为上次的一半,每次和自己后面的第2个进行比较,这样的比较进行两次

直到步长为0,结束我们的循环,这样时间复杂度最多为O(nlog_2n)

2.希尔排序代码

void shellSort(SortTable *table) {for (int gap=table->len/2;gap>0;gap/=2) {for (int i=gap;i<table->len;i++) {Element temp=table->data[i];int j;for (j=i;j>=gap&&temp.key<table->data[j-gap].key;j-=gap) {table->data[j]=table->data[j-gap];}table->data[j]=temp;}}
}

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

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

相关文章

【排序算法】④堆排序

系列文章目录 第一篇&#xff1a;【排序算法】①直接插入排序-CSDN博客 第二篇&#xff1a;【排序算法】②希尔排序-CSDN博客 第三篇&#xff1a;【排序算法】③直接选择排序-CSDN博客 第四篇&#xff1a;【排序算法】④堆排序-CSDN博客 第五篇&#xff1a;【排序算法】⑤冒…

Android领域驱动设计与分层架构实践

引言在Android应用开发中&#xff0c;随着业务逻辑日益复杂&#xff0c;传统的MVC或简单MVP架构往往难以应对。领域驱动设计(Domain-Driven Design, DDD)结合分层架构&#xff0c;为我们提供了一种更系统化的解决方案。本文将探讨如何在Android项目中应用DDD原则与分层架构&…

Android12 Framework电话功能UI定制

文章目录简介代码中间按钮Fragment创建VideoCallFragmentFragment管理添加按键挂断电话功能相关文章简介 Android版本&#xff1a;12 芯片平台&#xff1a;展锐 如下图为通话中的UI&#xff0c;打电话出去时显示的UI与此也差不多&#xff0c;但来电时UI是不一样的 这个界面是…

高并发场景下分布式ID生成方案对比与实践指南

高并发场景下分布式ID生成方案对比与实践指南 在分布式系统中&#xff0c;唯一且全局有序的ID生成器是很多业务的底层组件。随着系统并发量不断攀升&#xff0c;如何在高并发场景下保证ID的唯一性、性能、可用性和可扩展性&#xff0c;成为后端架构师需要重点考虑的问题。本文将…

Emscripten 指南:概念与使用

Emscripten 指南&#xff1a;概念与使用 什么是 Emscripten&#xff1f; Emscripten 是一个开源的编译器工具链&#xff0c;用于将 C/C 代码编译成高效的 WebAssembly&#xff08;Wasm&#xff09;和 JavaScript。它基于 LLVM 编译器架构&#xff0c;允许开发者&#xff1a; ✅…

使用镜像网站 打开克隆 GitHub 网站仓库内容 git clone https://github.com/

GitHub 网站有时因 DNS 解析问题或网络限制&#xff0c;国内访问可能会受限。使用镜像网站打开网站 使用镜像网站&#xff1a;GitHub 有一些镜像网站&#xff0c;可替代官网访问&#xff0c;如https://hub.fastgit.org、https://gitclone.com、https://github.com.cnpmjs.org等…

Linux随记(二十二)

一、redhat6.5 从openssh5.3 升级到openssh10 - 报错处理【升级后账号密码一直错误 和 sshd dead but subsys locked】 虚拟机测试情况 - 正常&#xff1a;情况一、 升级后账号密码一直错误 情况二、 执行service sshd status出现 sshd dead but subsys locked

机器学习之TF-IDF文本关键词提取

目录 一、什么是 TF-IDF&#xff1f; 1.语料库概念理解 二、TF-IDF 的计算公式 1. 词频&#xff08;TF&#xff09; 2. 逆文档频率&#xff08;IDF&#xff09; 3. TF-IDF 值 三、关键词提取之中文分词的实现 四、TF-IDF简单案例实现 &#xff08;1&#xff09;数据集…

Flutter屏幕和字体适配(ScreenUtil)

一、简介 flutter_screenutil 是一个 Flutter 插件&#xff0c;专门用于处理屏幕适配问题。它简化了不同设备间尺寸差异的处理&#xff0c;确保你的应用在各种屏幕上都能保持良好的显示效果。开发者可以通过简单的调用来设置基于设计图尺寸的控件宽高和字体大小。 项目地址&a…

mimiconda+vscode

安装miniconda实现python包管理&#xff0c;并通过vscode进行编写python代码 miniconda简单介绍 Miniconda 是 Anaconda 公司的一个轻量级 Python 发行版本&#xff0c;它包含了最基本的包管理器 conda 和 Python 环境&#xff0c;只带最核心的组件&#xff0c;没有额外的大量科…

Windows文件时间修改指南:从手动到自动化

修改文件的时间属性可以满足多种需求。比如&#xff0c;它可以帮助整理文件&#xff0c;使得文件按照特定的时间顺序排列&#xff0c;有助于更好地管理资料。它的体积真小&#xff0c;才300多KB。能用来调整文件的创建时间、最后访问和修改时间。文件时间属性修改_NewFileTime.…

能刷java题的网站

以下是一些适合刷Java题的优质网站&#xff0c;涵盖从基础到进阶、算法面试及实战项目等多种需求&#xff1a; ​一、综合编程练习平台​ ​LeetCode​&#xff08;leetcode.com&#xff09; ​特点​&#xff1a;全球最知名的算法题库&#xff0c;含海量Java题目&#xff0c;分…

掘金数据富矿,永洪科技为山东黄金定制“数智掘金”实战营

在黄金开采的轰鸣声中&#xff0c;另一场静水深流的“掘金行动”正悄然展开。山东黄金集团&#xff0c;这个行业的巨头&#xff0c;在深挖地层宝藏的同时&#xff0c;也敏锐捕捉到数据洪流中蕴藏的价值富矿。然而&#xff0c;当海量业务数据汇聚&#xff0c;如何从中精准提炼决…

【论文阅读】BEVFormer论文解析及Temporal Self-Attention、Spatial Cross-Attention注意力机制详解及代码示例

BEVFormer: Learning Bird’s-Eye-ViewRepresentation from Multi-Camera Images via Spatiotemporal Transformers|Temporal Self-Attention、Spatial Cross-Attention注意力机制详解 BEVFormer&#xff08;Bird’s-Eye-View Former&#xff09;是一种先进的计算机视觉模型&am…

在 Ubuntu 中docker容器化操作来使用新建的 glibc-2.32

在 Ubuntu 中使用容器化操作来使用新建的 glibc-2.32,可以通过创建自定义 Docker 镜像来实现。以下是完整的解决方案: 方案 1:创建包含 glibc-2.32 的 Docker 镜像 1. 创建 Dockerfile dockerfile # 使用 Ubuntu 基础镜像 FROM ubuntu:20.04# 安装编译依赖 RUN apt-get …

GOOUUU ESP32-S3-CAM 果云科技开发板开发指南(二)(超详细!)Vscode+espidf 摄像头拍摄视频实时传输到LCD,文末附源码

书接上回&#xff0c;上一篇blog是使用esp32s3通过ov2640摄像头拍摄到一帧照片&#xff0c;并把它保存到了SD卡中&#xff0c;这第二篇就通过LCD将拍摄到的图片显示到LCD上&#xff0c;本次分享硬件使用的 ESP32-S3-CAM 果云科技开发板&#xff0c;并且使用了配套的LCD扩展板&a…

攻防世界-ics-05(远程文件执行)

一.审题大致浏览一下网页&#xff0c;发现就这边会有东西。看一下源码会不会有东西或者稍微点击一下这个页面的内容看会不会出现东西。点击了一下这个云平台设备维护中心发现url变了&#xff0c;是get的方法传page参数二.尝试漏洞类型自己这边试了sql注入发现不是&#xff0c;试…

Dell PowerEdge: Servers by generation (按代系划分的服务器)

Dell PowerEdge: Servers by generation {按代系划分的服务器}1. Table of 17th, 16th, 15th, and 14th Generation PowerEdge servers2. List of all PowerEdge server models including Type, CPU vendor, Generation, and Remote ManagementReferencesPowerEdge: Servers by…

Rust学习笔记(二)|变量、函数与控制流

本篇文章包含的内容1 变量与常量2 类型2.1 标量类型2.2 复合类型3 函数4 控制流4.1 分支4.2 循环1 变量与常量 在Rust中&#xff0c;使用let关键字声明一个变量&#xff0c;变量默认是不可变的。如果要声明可变变量&#xff0c;需要使用mut关键字将其声明为可变变量。 let x …

【渲染流水线】[几何阶段]-[图元装配]以UnityURP为例

【从UnityURP开始探索游戏渲染】专栏-直达 前情提要 【渲染流水线】主线索引-从数据到图像以UnityURP为例-CSDN博客 图元装配负责将离散顶点组装成完整几何图元&#xff08;如点、线、三角形、三角形条带&#xff09; &#xff08;对渲染的探索是个持续不断完善的过程&#x…