当前位置: 首页 > news >正文

数据结构--排序(1)

文章目录

  • 排序概念
  • 直接插入排序
  • 希尔排序
  • 冒泡排序
  • 堆排序
  • 选择排序
  • 验证不同排序的运行时间

排序概念

排序指的是通过某一特征关键字(如信息量大小,首字母等)来对一连串的数据进行重新排列的操作,实现递增或者递减的数据排序。

稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。

在实际的应用中是非常常见的。

文件的排序
在这里插入图片描述
购物的商品排序
在这里插入图片描述

在我们常见的排序算法中,有这几种:
在这里插入图片描述
这些排序算法都是通过自身空间,通过不断交换来实现排序的

直接插入排序

思想:当我们拿到了一组数组时,先将第一个元素定为前序序列,让第二个元素与它对比,以升序为例,大的就放在第一个元素之后,小的就放在第一个元素之前,放完之后,两个元素将成为新的前序序列;接着就是将第三个元素与前序序列的元素比较,比较最大的元素,也就是前序序列的最后一个元素,比它大就将元素向后挪移,为插入数腾出一个元素空间;依此类推。
玩斗地主时从小排到大的就是这种思想:
在这里插入图片描述
在这里插入图片描述

#include"Sort.h"
void PrintfArray(int* a, int n)
{for (int i = 0; i < n; i++){printf("%d ", a[i]);}printf("\n");
}//直接插入排序
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){//将数组看作是一个个数插入进去的,从第二个数开始插入//比较插入数和前序序列最后一个数的大小//不符合条件就前序序列缩短,一直比较到大于end值停下来if (a[end] >tmp ){a[end + 1] = a[end];}else{break;}end--;}a[end + 1] = tmp;}}

内循环就是将新插入的数找到合适位置,让出空间,让新的数插入;
时间复杂度:O(N^2)

验证:

void TestInsertSort()
{int a[] = { 9,1,2,5,7,4,8,6,3,5,1,2,3,5,1,8,3 };InsertSort(a, sizeof(a) / sizeof(a[0]));PrintfArray(a, sizeof(a) / sizeof(a[0]));
}int main()
{TestInsertSort();return 0;
}

在这里插入图片描述

希尔排序

在上面的直接插入排序中,如果插入数一直大于前序序列,会发现内循环会走的比较快;因为都排序好了,只需要比较前序序列的最后一个元素即可;

思想:希尔排序中,就是先将一组数组分成几等份,将每一份都进行排序,这样对于下次进行直接插入排序就预先做好了排序,简称预排序;接着不断缩短每一份的长度,一直做着预排序,直到每一份的长度为1时,就相当于上面的直接插入排序。
在这里插入图片描述
在这里插入图片描述

希尔排序就是对直接插入排序进行优化,通过预排序,让数组的排序比较有序,这样在再次排序时,就会省出会很多时间。
对于gap的取值,一般习惯直接对半取,但现在也有将gap取成三等份的;但实际效果都差不多;

void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}//希尔排序
void ShellSort(int* a, int n)
{int gap = n;while (gap > 1){//gap=gap/2;gap = gap/3 + 1;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;}}}

1.将tmp与前序序列相比大小,交换,最后将空出的位插入tmp;
2.前序序列扩大了,新增一个数;
3.在不同组中进行直插;
4.进行不断的预排序;

在这里,不是将每一组排完再进行下一组的排序,而是排一组的前序序列之后,跳掉下一组去进行排序到前序序列;gap若取3等份,要加上1,不然可能会出现达不到gap==1的情况,如为8时,gap取到2就停止了;

这里不要看着有很多层循环进行嵌套,实际上它的算法效率是远远高于直接插入排序的,以gap一直取二等份为例,1000个数据也就取10次gap,100万数据也就取20次gap,10亿才取24次gap,所以外层的循环实际次数是不大的,相对如此大的数据几乎可以忽略不计;

验证:

void TestShellSort()
{int a[]= { 9,1,2,5,7,4,8,6,3,5,1,2,3,5,1,8,3 }; ShellSort(a, sizeof(a)/sizeof(a[0]));PrintfArray(a, sizeof(a) / sizeof(a[0]));
}
int main()
{TestShellSort();return 0;
}

在这里插入图片描述
时间复杂度:O(N^1.25) ~ O(1.6*N^1.25)

冒泡排序

思想:通过循环,不断的比较相邻的两个值,将最大的值往后放到最后一个位置,再通过一层循环,进行多躺的比较,总是将最大数往后放即可;
在这里插入图片描述
这样最大的数就排好了,以此类推排其他的数字;

//冒泡排序
void BubbleSort(int* a, int n)
{int mark = 0;for (int i = 0; i < n - 1; i++){for (int j = 0; j < n -1- i; j++){if (a[j] > a[j + 1]){Swap(&a[j], &a[j + 1]);mark = 0;}else{mark = 1;}}//表示没有进行交换,已排序好了if (mark == 1){break;}}}

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

堆排序

堆排序链接处

堆排序之前写过了,这里就不多解释;

void AdjustDown(int* a, int n, int parent)
{//左孩子int child = parent * 2 + 1;while (child<n){//右孩子比左孩子大if (child + 1 < n && a[child + 1] > a[child]){child++;}if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}
//堆排序
void HeapSort(int* a, int n)
{//建堆for (int i = (n - 1 - 1) / 2; i >= 0; i--){AdjustDown(a, n, i);}//交换int end = n - 1;while (end>0){Swap(&a[0], &a[end]);AdjustDown(a, end, 0);end--;}
}

时间复杂度:O(N*logN)

选择排序

思想:在数组中找出最大值和最小值的下标,记录它,然后分别与起始与结尾位置进行交换,这样一次就能找出最大值和最小值了,接着缩短数组起始和结尾位置,然后再通过循环依次进行此步骤;
在这里插入图片描述

void SelectSort(int* a,int n)
{int begin = 0;int end = n - 1;while (begin < end){int min = begin;int max = begin;//找出区间里的max和minfor (int i = begin + 1; i <= end; i++){if (a[i] < a[min]){min = i;}if (a[i] > a[max]){max = i;}}//将最小数放在起始位置Swap(&a[begin], &a[min]);//max位置的数一旦被改变,max也需跟随改变if (max == begin){max = min;}Swap(&a[end], &a[max]);begin++;end--;}
}

这里需要注意的是,如果起始点就是最大数时,当最小数与起始位置交换后,那么max表示下标,max不变,仍然指着起始位置的下标,所以需要跟随max的值改变而改变;

O(N^2)

验证不同排序的运行时间

通过10000个数据来验证它们的排序运行时间;

void TestOP()
{srand(time(NULL));const int N = 100000;int* a1 = (int*)malloc(sizeof(int) * N);int* a2 = (int*)malloc(sizeof(int) * N);int* a3 = (int*)malloc(sizeof(int) * N);int* a4 = (int*)malloc(sizeof(int) * N);int* a5 = (int*)malloc(sizeof(int) * N);//赋值for (int i = 0; i < N; i++){a1[i] = rand();a2[i] = a1[i];a3[i] = a2[i];a4[i] = a3[i];a5[i] = a1[i];}int begin1 = clock();InsertSort(a1, N);int end1 = clock();int begin2 = clock();ShellSort(a2, N);int end2 = clock();int begin3 = clock();BubbleSort(a3, N);int end3 = clock();int begin4 = clock();HeapSort(a4, N);int end4 = clock();int begin5 = clock();SelectSort(a5, N);int end5 = clock();printf("InsertSort:%d\n", end1 - begin1);printf("ShellSort:%d\n", end2 - begin2);printf("BubbleSort:%d\n", end3 - begin3);printf("HeapSort:%d\n", end4 - begin4);printf("SelectSort:%d\n", end5 - begin5);}
int main()
{TestOP();return 0;
}

在这里插入图片描述

相关文章:

数据结构--排序(1)

文章目录 排序概念直接插入排序希尔排序冒泡排序堆排序选择排序验证不同排序的运行时间 排序概念 排序指的是通过某一特征关键字&#xff08;如信息量大小&#xff0c;首字母等&#xff09;来对一连串的数据进行重新排列的操作&#xff0c;实现递增或者递减的数据排序。 稳定…...

【AI视野·今日NLP 自然语言处理论文速览 第三十七期】Thu, 21 Sep 2023

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 21 Sep 2023 Totally 57 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Chain-of-Verification Reduces Hallucination in Large Language Models Authors Shehzaad Dhuliawala, Mojt…...

高防服务器防护效果怎么样?

对于很多拥有在线业务的公司&#xff0c;数据是非常重要&#xff0c;如果遭到网络攻击会导致很严重的后果&#xff0c;所以很多公司选择高防服务器&#xff0c;那么高防服务器防护效果是怎么样的呢&#xff1f;今天就让小编带大家看一看吧&#xff01; 弹性带宽。高防服务器一…...

tomcat架构概览

https://blog.csdn.net/ldw201510803006/article/details/119880100 前言 Tomcat 要实现 2 个核心功能&#xff1a; 处理 Socket 连接&#xff0c;负责网络字节流与 Request 和 Response 对象的转化。加载和管理 Servlet&#xff0c;以及具体处理 Request 请求。 因此 Tomc…...

海康的资料

系列文章目录 文章目录 系列文章目录前言一、海康二、使用步骤1.引入库2.读入数据 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了学…...

【ELFK】之消息队列kafka

本章结构&#xff1a; 1、为什么要使用消息队列MQ 2、使用消息队列的好处 3、消息队列的两种模式 4、对Kafka的概述 5、Kafka的特性 6、Kafka的系统架构 7、部署Kafka Kafka 定义 Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff08;MQ&#xff0c;Message Qu…...

Qt核心:元对象系统、属性系统、对象树、信号槽

一、元对象系统 1、Qt 的元对象系统提供的功能有&#xff1a;对象间通信的信号和槽机制、运行时类型信息和动态属性系统等。 2、元对象系统是 Qt 对原有的 C进行的一些扩展&#xff0c;主要是为实现信号和槽机制而引入的&#xff0c; 信号和槽机制是 Qt 的核心特征。 3、要使…...

【若依框架2】前后端分离版本添加功能页

在VSCode的src/views下新建个文件平example,在example下创建test文件夹&#xff0c;在test里创建index.vue文件 <template> <h1>Hello world</h1> </template><script> export default {name: "index" } </script><style s…...

Unity Bolt模块间通信

使用Bolt无代码设计开发的时候&#xff0c;我们不能简单的认为只需要一个FlowMachine就可以完成所有流程的开发。我们需要不同的模块进行拆分&#xff0c;以便更好的管理和协作。这就需要不同模块之间的通信处理。经过研究与使用&#xff0c;将常用的通信方式总结如下&#xff…...

please choose a certificate and try again.(-5)报错怎么解决

the server you want to connect to requests identification,please choose a certificate and try again.(-5)...

国产自研BI系统,更懂中国企业数据分析需求

国产自研BI系统是指由中国企业自主研发的商业智能&#xff08;BI&#xff09;系统&#xff0c;这类系统更加了解中国企业的数据分析需求&#xff0c;能够提供更加贴合实际的解决方案。比如说奥威BI系统就是典型的国产自研&#xff0c;不仅了解中国企业的数据分析需求&#xff0…...

基于Java的高校竞赛管理系统设计与实现(亮点:发起比赛、报名、审核、评委打分、获奖排名,可随意更换主题如蓝桥杯、ACM、王者荣耀、吃鸡等竞赛)

高校竞赛管理系统 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序&#xff08;小蔡coding&#xff09;2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述4.2 系统角色 五、系统…...

出血性脑卒中临床智能诊疗建模

先说下数据&#xff0c;随访流水号是患者的后续诊断号码&#xff0c;表3有对应的数据&#xff0c;首先需要做下数据整理&#xff0c;需要整理出每次诊断的指标&#xff08;包括表1中人物信息、表2中的检查指标以及表3中的检查指标&#xff0c;表4中有对应的时间&#xff0c;以刚…...

Cesium 空间量算——生成点位坐标

文章目录 需求分析1. 点击坐标点实现2. 输入坐标实现 需求 用 Cesium 生成点位坐标&#xff0c;并明显标识 分析 以下是我的两种实现方式 第一种是坐标点击实现 第二种是输入坐标实现 1. 点击坐标点实现 //点位坐标getLocation() {this.hoverIndex 0;let that this;this.view…...

为什么曲面函数的偏导数可以表示其曲面的法向量?

为什么曲面函数的偏导数可以表示其曲面的法向量&#xff1f; 引用资料&#xff1a; 1.知乎shinbade&#xff1a;曲面的三个偏导数为什么能表示法向量&#xff1f; 2.Geogebra羅驥韡 (Pegasus Roe)&#xff1a;偏導數、切平面、梯度 曲面 F ( x , y , z ) 0 F(x,y,z)0 F(x,y,…...

❤Uniapp报npx update-browserslist-db@latest

❤ Uniapp报npx update-browserslist-dblatest 按照提示先更新一下 npx update-browserslist-dblatest然后打开一下端口...

【C++】静态成员函数 ( 静态成员函数概念 | 静态成员函数声明 | 静态成员函数访问 | 静态成员函数只能访问静态成员 )

文章目录 一、静态成员函数简介1、静态成员函数概念2、静态成员函数声明3、静态成员函数访问4、静态成员函数只能访问静态成员 二、代码示例 - 静态成员函数 一、静态成员函数简介 1、静态成员函数概念 静态成员函数归属 : 在 C 类中 , 静态成员函数 是一种 特殊的函数 , 该函数…...

基于若依ruoyi-nbcio增加flowable流程待办消息的提醒,并提供右上角的红字数字提醒(三)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 1、上一节说到RedisReceiver &#xff0c;这里有调用了NbcioRedisListener自定义业务监听&#xff0c;如下…...

用友第五届开发者大赛初赛晋级公示,复赛火热进行中!

用友第五届开发者大赛初赛晋级公示&#xff0c;复赛火热进行中&#xff01; 自7月13日鸣锣揭幕&#xff0c;9月6日各赛道作品初评工作完成&#xff0c;历时近两月&#xff0c;用友第五届企业云服务开发者大赛初赛阶段顺利落下帷幕。作为备受各界开发者关注的赛事&#xff0c;本…...

SSL证书如何做到保障网站安全?

当网站显示不安全时&#xff0c;用户会在头脑中产生该网站是否合法的疑问&#xff0c;如果是购物网站或者购物商城&#xff0c;那意味着可能会损失大部分的用户。而SSL证书能有效保障网站的安全性&#xff0c;轻松解决网站不被用户信任的问题。那么&#xff0c;SSL证书究竟是如…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

sshd代码修改banner

sshd服务连接之后会收到字符串&#xff1a; SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢&#xff1f; 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头&#xff0c…...