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

数据结构——八大排序(下)

        数据结构中的八大排序算法是计算机科学领域经典的排序方法,它们各自具有不同的特点和适用场景。以下是这八大排序算法的详细介绍:

五、选择排序(Selection Sort)

  • 核心思想:每一轮从未排序的元素中选择最小(或最大)的元素,放到已排序的序列末尾。
  • 时间复杂度:O(n^2),因为每一轮都需要遍历整个未排序的数组。
  • 空间复杂度:O(1)。
  • 稳定性:不稳定,因为选择最小(或最大)元素时可能会破坏相同元素的相对位置。

package 排序;import java.util.Arrays;public class Selection{//选择排序public  static void main(String[] args) {int[] arr= {15,27,34,62,30,16};sort(arr);System.out.println(Arrays.toString(arr));}public static void sort(int[] arr) {for(int j=0;j<arr.length;j++) {int min=arr[j];int minIndex=j;for(int i=j;i<arr.length;i++) {if(arr[i]<min) {min=arr[i];minIndex=i;}}arr[minIndex]=arr[j];arr[j]=min;}	}
}

六、堆排序(Heap Sort)

  • 核心思想:利用堆这种数据结构进行排序。首先构建一个大顶堆(或小顶堆),然后依次将堆顶元素(最大或最小)与堆底元素交换,并减少堆的大小。最后,对剩余的元素重新调整成堆,直到整个数组有序。
  • 时间复杂度:O(nlogn),因为构建堆和调整堆的时间复杂度都是O(logn),而需要构建和调整n次。
  • 空间复杂度:O(1),因为排序过程中只需要常量的额外空间(用于交换元素)。
  • 稳定性:不稳定,因为堆的调整过程中可能会破坏相同元素的相对位置。
package 排序;import java.util.Arrays;public class Heap{
//堆排序public static void main(String[] args) {int[] arr= {5,7,4,2,0,1,6};//一、构建大顶堆for (int p=arr.length-1;p>=0;p--) {sort(arr, p, arr.length);}//二、堆底堆顶元素进行交换for(int i=arr.length-1;i>0;i--) {int temp=arr[i];arr[i]=arr[0];arr[0]=temp;sort(arr, 0, i);}//打印System.out.println("堆排序的结果为:");System.out.println(Arrays.toString(arr));}//堆的维护public static void sort(int[] arr,int parent,int length) {//定义左孩子int child=2*parent+1;while(child<length) {//定义右孩子int rchild=child+1;if(rchild<length && arr[rchild]>arr[child]) {child++;}//child指向左右孩子中的最大值//父子节点进行比较if(arr[parent]<arr[child]) {//父子节点进行交换int temp=arr[parent];arr[parent]=arr[child];arr[child]=temp;//parent指向child,child继续指向左右孩子中的最大值parent=child;child=2*child+1;}else {break;}}}
}

七、归并排序(Merge Sort)

  • 核心思想:将数组分成两部分,分别进行排序,然后将两部分合并成一个有序数组。这个过程可以递归地进行。
  • 时间复杂度:O(nlogn),因为每次合并都需要遍历两个有序数组。
  • 空间复杂度:O(n),因为需要额外的空间来存储合并后的有序数组(虽然可以使用原地归并算法来减少空间复杂度,但实现起来较为复杂)。
  • 稳定性:稳定,因为合并过程中相同元素会保持相对位置不变。
package 排序;import java.util.Arrays;public class Merge{public static void main(String[] args) {int[] arr= {11,22,33,55,2,11,24,63};mergeSort(arr,0,arr.length-1);System.out.println(Arrays.toString(arr));}//拆分public static void mergeSort(int[] arr, int left, int right) {//递归出口if(left==right) {return;}int mid=(left+right)/2;//向左拆分mergeSort(arr,left,mid);//向右拆分mergeSort(arr,mid+1,right);//合并merge(arr,left,right,mid);}public static void merge(int[] arr,int left,int right,int mid) {//定义第一段和第二段的开始int s1=left;int s2=mid+1;//定义临时空间int[] temp =new int[right-left+1];int index=0;//定义游标遍历临时空间//判断s1和s2指向的数据大小,将其存入临时数组while(s1<=mid&&s2<=right) {if(arr[s1]<arr[s2]) {temp[index]=arr[s1];s1++;index++;}else {temp[index]=arr[s2];s2++;index++;}}//判断s1中是否有数据,如果有将其放入临时数组当中while(s1<=mid) {temp[index]=arr[s1];s1++;index++;}//判断s2中是否有数据,如果有将其放入临时数组当中while(s2<=right) {temp[index]=arr[s2];s2++;index++;}//将临时数组中的数据写回原数组for(int i=0;i<temp.length;i++) {arr[left+i] = temp[i];}}
}

八、基数排序(Radix Sort)

  • 核心思想:基数排序是一种非比较型排序算法,它根据元素的位数(或字符)进行排序。通常从最低有效位(或字符)开始,依次对每一位(或字符)进行计数排序或桶排序,直到最高有效位(或字符)为止。
  • 时间复杂度:O(d(n+r)),其中d是位数(或字符数),n是待排序元素的个数,r是基数(如对于十进制数,r=10)。
  • 空间复杂度:O(n+r),因为需要额外的空间来存储桶或计数数组。
  • 稳定性:稳定,因为每一位(或字符)的排序过程中都保持相同元素的相对位置不变。
package 排序;import java.util.Arrays;public class Radix{//基数排序,注意,基数排序只能排整数。适用于数据位数不多,但数据量大的数据集public static void main(String[] args) {int[] arr= {50,17,41,20,101,11,26,35,47,63,214,63,88};sort(arr);System.out.println(Arrays.toString(arr));}public static void sort(int[] arr) {//取最大值,计算最大值的位数int max=arr[0];for(int j=0;j<arr.length;j++) {if(arr[j]>max) {max=arr[j];}}int maxLen=(max+"").length();//返回最大值的位数System.out.println("最大值的位数为"+maxLen);//定义桶(本质上定义二维数组)int[][] bucket=new int[10][arr.length];//定义桶记录工具(一维数组,长度为10)int[] elementCounts=new int[10];int n=1;//放入取出来来回回执行maxLen遍for(int m=0;m<maxLen;m++) {//遍历数组,将数组中的数据放入桶中for(int i=0;i<arr.length;i++) {//个位开始排序int element =arr[i]/n%10;  //element代表个位数值,也代表要被放在哪个桶//读取桶记录工具中的数值int count=elementCounts[element];//数据放入bucket[element][count]=arr[i];elementCounts[element]++;}//将桶中的数据取出int index=0;//定义index游标,遍历数组,将桶中数据存入数组里for(int k=0;k<elementCounts.length;k++) {if(elementCounts[k]!=0) {//不为0桶中有数据,将数据取出for(int l=0;l<elementCounts[k];l++) {arr[index]=bucket[k][l];index++;}}//清理桶记录elementCounts[k]=0;}n=n*10;}}	}

综上所述,这八大排序算法各有优缺点和适用场景。在实际应用中,需要根据待排序数据的特点和具体需求来选择合适的排序算法。

相关文章:

数据结构——八大排序(下)

数据结构中的八大排序算法是计算机科学领域经典的排序方法&#xff0c;它们各自具有不同的特点和适用场景。以下是这八大排序算法的详细介绍&#xff1a; 五、选择排序&#xff08;Selection Sort&#xff09; 核心思想&#xff1a;每一轮从未排序的元素中选择最小&#xff0…...

Linux系统:Ubuntu上安装Chrome浏览器

Ubuntu系统版本&#xff1a;23.04 在Ubuntu系统上安装Google Chrome浏览器&#xff0c;可以通过以下步骤进行&#xff1a; 终端输入以下命令&#xff0c;先更新软件源&#xff1a; sudo apt update 或 sudo apt upgrade终端输入以下命令&#xff0c;下载最新的Google Chrome .…...

Redis位图BitMap

一、为什么使用位图&#xff1f; 使用位图能有效实现 用户签到 等行为&#xff0c;用数据库表记录签到&#xff0c;将占用很多存储&#xff1b;但使用 位图BitMap&#xff0c;就能 大大减少存储占用 二、关于位图 本质上是String类型&#xff0c;最小长度8位&#xff08;一个字…...

YOLOv11改进策略【卷积层】| ParNet 即插即用模块 二次创新C3k2

一、本文介绍 本文记录的是利用ParNet中的基础模块优化YOLOv11的目标检测网络模型。 ParNet block是一个即插即用模块,能够在不增加深度的情况下增加感受野,更好地处理图像中的不同尺度特征,有助于网络对输入数据更全面地理解和学习,从而提升网络的特征提取能力和分类性能…...

学习threejs,网格深度材质MeshDepthMaterial

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️网格深度材质MeshDepthMate…...

算法时间、空间复杂度(二)

目录 大O渐进表示法 一、时间复杂度量级的判断 定义&#xff1a; 例一&#xff1a;执行2*N&#xff0b;1次 例二&#xff1a;执行MN次 例三&#xff1a;执行已知次数 例四:存在最好情况和最坏情况 顺序查找 冒泡排序 二分查找 例五&#xff1a;阶乘递归 ​编辑 例…...

高级java每日一道面试题-2024年10月11日-数据库篇[Redis篇]-Redis都有哪些使用场景?

如果有遗漏,评论区告诉我进行补充 面试官: Redis都有哪些使用场景? 我回答: Redis 是一个开源的、基于键值对的数据结构存储系统&#xff0c;&#xff0c;它支持多种数据类型&#xff0c;包括字符串、散列、列表、集合和有序集合。它可以用作数据库、缓存和消息中间件。由于…...

0047__【python打包分发工具】setuptools详解

【python打包分发工具】setuptools详解-CSDN博客...

自定义拦截器处理token

目录 1、WebConfig 配置类 2、TSUserContext 把用户信息放到context中 3、自定义拦截器 4、在controller中可以使用 5、参考链接 1、WebConfig 配置类 @Configuration public class WebConfig implements WebMvcConfigurer {@Autowiredprivate AccessControlInterceptor …...

Scrapy | 使用Scrapy进行数据建模和请求

scrapy数据建模与请求 数据建模1.1 为什么建模1.2 如何建模1.3如何使用模板类1.4 开发流程总结 目标&#xff1a; 1.应用在scrapy项目中进行建模 2.应用构造Request对象&#xff0c;并发送请求 3.应用利用meta参数在不同的解析函数中传递数据 数据建模 | 通常在做项目的过程中…...

学习笔记——交换——STP(生成树)基本概念

三、基本概念 1、桥ID/网桥ID (Bridege ID&#xff0c;BID) 每一台运行STP的交换机都拥有一个唯一的桥ID(BID)&#xff0c;BID(Bridge ID/桥ID)。在STP里我们使用不同的桥ID标识不同的交换机。 (2)BID(桥ID)组成 BID(桥ID)组成(8个字节)&#xff1a;由16位(2字节)的桥优先级…...

机器学习笔记-2

文章目录 一、Linear model二、How to represent this function三、Function with unknown parameter四、ReLU总结、A fancy name 一、Linear model 线性模型过于简单&#xff0c;有很大限制&#xff0c;我们需要更多复杂模式 蓝色是线性模型&#xff0c;线性模型无法去表示…...

SpringSecurity(一)——认证实现

一、初步理解 SpringSecurity的原理其实就是一个过滤器链&#xff0c;内部包含了提供各种功能的过滤器。 当前系统中SpringSecurity过滤器链中有哪些过滤器及它们的顺序。 核心过滤器&#xff1a; &#xff08;认证&#xff09;UsernamePasswordAuthenticationFilter:负责处理…...

VMWare NAT 模式下 虚拟机上不了网原因排查

vmware 按照了Linux之后 无法上网&#xff0c;搞定后&#xff0c;记录一些信息。 window有两个虚拟网卡 VMnet1 对应的是 Host-Only&#xff08;仅主机模式&#xff09; VMnet8 对应的是 NAT&#xff08;网络地址转换模式&#xff09; 在NAT模式中&#xff0c;需要设置NAT和D…...

R语言手工实现主成分分析 PCA | 奇异值分解(svd) 与PCA | PCA的疑问和解答

几个问题: pca可以用相关系数矩阵做吗?效果比协方差矩阵比怎么样?pca做完后变量和样本的新坐标怎么旋转获得?pca做不做scale和center对结果有影响吗?pca用因子分解和奇异值分解有啥区别?后者怎么获得变量和样本的新坐标?1. 用R全手工实现 PCA(对比 prcomp() ) 不借助包…...

第三届OpenHarmony技术大会在上海成功举办

10月12日&#xff0c;以“技术引领筑生态&#xff0c;万物智联创未来”为主题的第三届OpenHarmony技术大会&#xff08;以下简称“大会”&#xff09;在上海成功举办。本次大会由OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;项目群技术指导委员会&…...

数字化:IT部门主导还是业务部门主导?

在这个瞬息万变的数字化时代&#xff0c;企业如同在大海中航行的小船&#xff0c;面对波涛汹涌的市场竞争&#xff0c;数字化转型已成为生存的必经之路。然而&#xff0c;在这条充满挑战的航线上&#xff0c;常常会出现一个让人纠结的问题&#xff1a;数字化转型究竟应该由IT部…...

MySQL表的基本查询下/分组聚合统计

1&#xff0c;update 对查询到的结果进行列值更新&#xff0c;可以和older by&#xff0c;where&#xff0c;limit合并使用&#xff0c;为了方便讲解&#xff0c;将会以题目练习的方式进行说明&#xff1a; 1&#xff0c;将孙悟空同学的数学成绩变更为 80 分 本道题和where联…...

条款3: 理解decltype

目录 一、decltype + 变量 二、decltype + 表达式 三、decltype 使用场景 一、decltype + 变量 🥭 所有的信息都会保留,数组和函数也不会退化 const int &&carref = std::move(ca); decltype(carref) bb; // bb推导为const int &&,不会被忽略掉co…...

TCP:过多的TIME_WAIT

过多的TIME_WAIT 线上问题紧急处理方式tcp_tw_reuse启用主要特点&#xff1a;源码 线上问题 线上机器出现了几万个TIME_WAIT&#xff0c;怎么办&#xff1f; 紧急处理方式 tcp_tw_reuse 启用 默认情况下tcp_tw_reuse是关闭状态&#xff0c;使用sysctl -w net.ipv4.tcp_tw_…...

化学元素分子量、氧化物系数计算python类

在网上找到的分子量计算类&#xff0c;做了少量修改,有原子量、分子量、氧化物系数的计算。 import re wt_dict{ #该原子量数据从CRC手册第95版提取。"H": 1.008,"He": 4.002602,"Li": 6.94,"Be": 9.0121831,"B": 10.…...

torch.utils.data.DataLoader参数介绍

torch.utils.data.DataLoader 是 PyTorch 用于加载数据的重要工具,特别是在深度学习模型训练中。它可以高效地处理大规模数据集,并支持多线程数据加载。以下是 DataLoader 的关键参数及其功能: 主要参数 dataset: 要加载的数据集,可以是 PyTorch 自带的 torch.utils.data.…...

echarts 入门

工作中第一次碰到echarts&#xff0c;当时有大哥。二进宫没办法&#xff0c;只能搞定它。 感觉生活就是这样&#xff0c;不能解决的问题总是会反复出现。通过看视频、查资料&#xff0c;完成了工作要求。写一篇Hello World&#xff0c;进行备查。 基本使用 快速上手 <!DO…...

WPF实现类似网易云音乐的菜单切换

这里是借助三方UI框架实现了&#xff0c;感兴趣的小伙伴可以看一下。 深色模式&#xff1a;​ 浅色模式&#xff1a; ​这里主要使用了以下三个包&#xff1a; MahApps.Metro&#xff1a;UI库&#xff0c;提供菜单导航和其它控件​​​​​​​ 实现步骤&#xff1a;1、使用B…...

OpenCV人脸检测与识别:构建智能识别系统

在当今科技日新月异的时代&#xff0c;人脸识别技术以其独特的便利性和安全性&#xff0c;在各个领域都展现出了巨大的应用潜力。从智能手机的面部解锁&#xff0c;到机场的自动安检&#xff0c;再到商场的顾客行为分析&#xff0c;人脸识别技术无处不在。本文将深入探讨如何使…...

H5 Canvas 举牌小人

之前看到这种的举牌小人的图片觉得很有意思&#xff0c;最近有时间所以就尝试写写看。 在线链接 https://linyisonger.github.io/H5.Examples/?name./080.Canvas%20%E4%B8%BE%E7%89%8C%E5%B0%8F%E4%BA%BA.html 生成效果 实现代码 <!DOCTYPE html> <html lang"…...

rom定制系列------小米6x_澎湃os1.0.28安卓13定制固件修改 刷写过程与界面预览

&#x1f49d;&#x1f49d;&#x1f49d; 在接待很多定制化系统过程中。小米6x机型为很多工作室客户使用。但官方低版本固件无法适应新应用的使用。有些第三方固件却可以完美解决。此固件是客户分享的卡刷固件。需要修改为可以批量刷写的线刷固件。去除一些内置应用。需要自带…...

电脑硬件性能:HDD + SSD + CPU + GPU

文章目录 任务管理器&#xff1a;性能参数详解一、电脑的硬件组成二、机械硬盘和固态硬盘2.1、详细介绍&#xff1a;HDD SSD2.2、读写性能2.2.1、&#xff08;HDD&#xff09;读写性能的影响因素&#xff1a;寻道时间 旋转延迟 数据传输时间2.2.2、&#xff08;SSD&#xff…...

通过粒子系统customData传值给材质球

粒子特效使用的材质球&#xff0c;如果通过动画控制shader的某个参数&#xff0c;例如溶解阈值&#xff0c;所有的粒子都会按照相同的数值变化&#xff0c;如果需要每个粒子在自己的生命周期内按照曲线变化&#xff0c;则可以通过customData实现。 1.ParticleSystem中勾选Cust…...

常用分布的数学期望、方差、特征函数

文章目录 相关教程相关文献常用分布的数学期望&方差&特征函数定义事件域概率条件概率随机变量分布函数连续随机变量的概率密度函数数学期望离散随机变量连续随机变量 方差与标准差最大似然估计特征函数 不等式Chebyshev&#xff08;切比雪夫&#xff09;不等式 作者&am…...