数据结构算法——排序算法

1.排序

1.选择排序

不稳定,一般不用,基本排序

思路:过滤数组,找到最小数,放在前面。

不稳:导致原本在前的数据移动到后面。

	int arr[];for(i=0;i<arr.length-1;i++){int smallest=i;			for(j=i+1;j<length;j++){	if(arr[j]<arr[smallest]){smallest=j;}swap(arr,i,smallest);}}

时间复杂度O(n2),空间复杂度O(1)

2.冒泡排序

稳定,不常用,太慢,基本排序

思路:从第一个数两两比较,然后大的向后交换位置。

	int arr[];for(i=arr.length-1;i>0;i--){for(j=0;j<i;j++){if(arr[j]>arr[j+1]){swap[arr,j,j+1]}}}

时间复杂度O(n2),空间复杂度O(1)

3.插入排序

稳定,三种基本排序中最常用,在数据较少且有一定次序时效率很高

思路:从第二位向后过滤,向前逐位比较并与更小的交换直到大于或等于。

	int arr[];for(i=1;i<arr.length-1;i++){for(j=i;i>0;i--){if(arr[j-1]>arr[j]) swap(arr,j-1,j);}}

时间复杂度O(n2),空间复杂度O(1)

4.希尔排序

稳定,是优化过的插入排序

思路:按一定数据间隔将数据分组进行插入排序,然后缩小间隔进行,直到为1。

问:为什么比插入排序更优?

答:分组大时,换位次数少。分组小时,换位距离短。

	int arr[];int h=1;while(h<=arr.length/3){h=h*3+1;			//计算Knuth数列}for(gap=h;gap>0;gap=(gap-1)/3){		//缩小间隔for(i=gap;i<arr.length;i++){for(j=i;j>gap-1;j-=gap){if(arr[j-gap]>arr[j]) swap(arr,j-gap,j);	//每组进行插入排序}}

时间复杂度O(n^1.3),空间复杂度O(1)

5.归并排序

稳定,对于预先有一定次序的数组效率很高

思路:将数组递归地分为两部分,然后两个部分中的数依次比较,较小的填入中间数组。

public void sort(int[] arr,left,right){if(left==right) return;			//边界判定,何时停止int mid=left-(left+right)/2;		//递归中点计算sort(arr,left,mid);					//左侧递归sort(arr,mid+1,right);				//右侧递归merge(arr,left,mid,right);			//进行分组排序print(arr);
}	public void merge(int[] arr,leftPtr,rightPtr,rightBound){int temp[]=new int[leftPtr-rightBound+1];		//定义中间数组int i=leftPtr;		//定义左指针,右指针int j=rightPtr;int k=-1;while(i<rightPtr&&j<rightBound){temp[k++] = arr[i] <= arr[j] ? arr[++i] : arr[++j];		//将左指针和右指针指向的数小的放入中间数组}	while(i<rightPtr-1) temp[k++]=arr[i++];		//将左侧剩余数放入中间数组while(j<rightBound) temp[k++]=arr[j++];			//将右侧剩余数放入中间数组for(int m=0;m<temp.length;m++) arr[leftPtr+m]=temp[m];			//将中间数组放入原数组
}

时间复杂度O(N log N),空间复杂度O(N)

6.快速排序

不稳

原理:选出一个数,将比它小的数放到它左侧,比它大的数放到它右侧。

可优化位双轴快速排序(java中对较大数组的排序方法)

/*
*@param left 左边界
*@param right 右边界
*/
public void sort(arr[],left,right){		//边界判断if(left>=right) return;		//初始化左右指针int i=left;						int j=right;//将最后一位定为pivotint pivot=arr[right];			while(i<j){//如果左侧比pivot大,则与右侧比pivot小的换位while(arr[i]<=pivot) i++;	while(arr[j]>pivot) j--;//如果左指针大于等于右指针说明本次排序结束if(i>=j) break;swap(arr,i,j);}if(arr[i]<=pivot){swap(arr,i+1,right);			//将pivot放在中间,此时,左侧比pivot小,右侧比pivot大}else{swap(arr,i,right);}sort(arr[],left,i-1);			//左侧递归sort(arr[],i,right);			//右侧递归
}

时间复杂度O(N log N),空间复杂度O(1)

7.计数排序

桶排序的一种,非比较排序,稳定(优化后),对于数量大但数据大小数量少的情况效率很高

思路:将每种数据的数量放入中间数组中,然后按放回原数组中。

	int arr[];//进行取数组最大值,最小值的步骤,在此处省略,并初始化min,max为最小最大值int max;int min;sort(arr,max,min){int count=new int[max-min+1];		//设置计数桶int temp[arr.length];				//初始化中间数组for(i=0;i<arr.length;i++){count[arr[i]-min]++;			//计数}for(j=0;j<count.length;j++){count[j+1]+=count[j];			//优化步骤,此时桶中存储的是该数据最后一位的位置}for(k=arr.length;k>=0;k--){temp[--count[ arr[k]-min ]] = arr[k];		//优化步骤,从原数组最后开始过滤,将数据放到对应位置}return temp;}

时间复杂度O(N+K),空间复杂度O(N+K)  (K是计数桶大小)

8.基数排序

桶排序的一种,非比较排序,基于技术排列,稳定

思路:对数据每一位上进行计数排列

从最低位开始的基数排序

	int arr[];//对最高位进行计算,此处跳过此步骤,直接初始化变量h为最高位数int h;sort(arr,h){int count=new int[10];		//设置计数桶,此时只有0-9int temp[arr.length];				//初始化中间数组for(m=0;m<h;m++){int divison=(int)Math.pow(10,m);		//求10的m次幂for(i=0;i<arr.length;i++){count[arr[i]/divison%10]++;			//计数}for(j=0;j<count.length-1;j++){			//优化步骤,此时桶中存储的是该数据最后一位的位置count[j+1]+=count[j];			}for(k=arr.length;k>=0;k--){				//优化步骤,从原数组最后开始过滤,将数据放到对应位置temp[--count[arr[k]]]=arr[k];		}}return temp;}

从最高位开始的基数排序

递归思想

	int arr[];//对最高位进行计算,此处跳过此步骤,直接初始化变量h为最高位数int h;sort(arr,h){if(h=1) return temp;int divison=(int)Math.pow(10,h);		//求10的i次幂int count=new int[10];		//设置计数桶,此时只有0-9int temp[arr.length];				//初始化中间数组for(i=0;i<arr.length;i++){count[arr[i]/divison%10]++;			//计数}for(j=0;j<count.length-1;j++){			//优化步骤,此时桶中存储的是该数据最后一位的位置count[j+1]+=count[j];			}sort(arr,h-1);for(k=arr.length;k>=0;k--){				//优化步骤,从原数组最后开始过滤,将数据放到对应位置temp[--count[arr[k]]]=arr[k];		}}

时间复杂度O(N_K),空间复杂度O(N_K)  (K是计数桶大小)

9.桶排序

不常用,效率低

思路:将数据区域分为几个“桶”,将数据放入对应的“桶”中,对每个桶进行排序(其他排序方法或者递归)。

10.堆排序

堆排序是利用堆这种数据结构设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为 O(NlogN),不稳定

思路:将数组转换成一个堆(视情况使用大顶堆或者小顶堆,此处为大顶堆),将最大值下沉(第一位和最后一位换位),将其他位数转换成堆,直到数组有序。

public static void heapSort(int arr[]) {int temp = 0;for(int i = arr.length / 2 -1; i >=0; i--) {adjustHeap(arr, i, arr.length);}for(int j = arr.length-1;j >0; j--) {swap(i,j);adjustHeap(arr, 0, j);}
}//将一个数组(二叉树), 调整成一个大顶堆
/**
* 功能: 完成 将 以 i 对应的非叶子结点的树调整成大顶堆
* @param arr 待调整的数组
* @param ptr 表示非叶子结点在数组中索引
* @param length 表示对多少个元素继续调整, length 是在逐渐的减少
*/
public static void adjustHeap(int arr[], int ptr, int length) {// k = ptr * 2 + 1 k 是 ptr 结点的左子结点for(int k = ptr * 2 + 1; k < length; k = k * 2 + 1) {//判断,避免遍历左右子树if(k+1 < length && arr[k] < arr[k+1]) { //如果左子节点比右子节点小,则转向右子节点k++; 									}//子节点判断if(arr[k] > arr[ptr]) { 	swap(arr,ptr,j) 	ptr = k; 				//对子树进行调整,避免结构混乱} else {break;}}
}

时间复杂度 O(N*Log N),空间复杂度O(1)

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

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

相关文章

【OpenCV】灰度化和二值化处理图像

文章目录 1. 图像灰度化处理对比2. 代码示例3. 二值化处理 1. 图像灰度化处理对比 2. 代码示例 #include <opencv2/opencv.hpp> using namespace cv;int main() {Mat currentImage imread("path_to_image.jpg"); // 读取彩色图像Mat grayImage;// 将彩色图像…

SOMEIP_ETS_106: SD_ClientServiceSubscribeEventgroup

测试目的&#xff1a; 验证DUT在客户端模式下能够订阅测试器提供的ETS&#xff08;Enhanced Testability Service&#xff09;服务。 描述 本测试用例旨在确保DUT在客户端模式下能够通过发送FindService消息发现服务&#xff0c;并在接收到测试器提供的OfferService消息后&a…

大模型如何生成下一个token--解码策略

Background 生成模型目前主要使用自回归&#xff08;Autoregressive&#xff09;模型&#xff0c;通过上文信息预测下文信息&#xff0c;如GPT系列&#xff1b; BERT系列使用自编码&#xff08;AutoEncode&#xff09;模型&#xff0c;在输入中随机mask一部分token&#xff0c…

关于ansible自动化运维工具

成长路上不孤单&#x1f60a;【14后&#xff0c;C爱好者&#xff0c;持续分享所学&#xff0c;如有需要欢迎收藏转发&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#xff01;&#xff01;&#xff01;&#xff01;&#xff…

HCIE和CCIE,哪个含金量更高点?

在现在内卷的大环境下&#xff0c;技术岗可谓人人自危&#xff0c;也因此各种认证的重视程度直线升高。 特别是华为认证的HCIE和思科认证的CCIE&#xff0c;它们都代表着网络技术领域的顶尖水平。 但面对这两个高含金量的认证&#xff0c;不得不让人问出这个问题&#xff1a;同…

关于Hadoop重新格式化之后集群的崩溃问题

关于Hadoop重新格式化之后集群的崩溃问题 文章目录 关于Hadoop重新格式化之后集群的崩溃问题写在前面版本信息实验场景 HiveHive交互段查询报错原因分析解决方法手动启动元数据服务重新初始化元数据库 HBase清理虚拟机磁盘参考资料 写在前面 版本信息 Linux版本&#xff1a;C…

ListBox显示最新数据、左移和右移操作

1、程序 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static Sys…

基于SSM的二手交易管理系统的设计与实现 (含源码+sql+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的二手交易管理系统1拥有两种角色 管理员&#xff1a;商品管理、订单管理、充值管理、用户管理等用户&#xff1a;发布商品、查看闲置、充值账户、查看所有订单、发布求购信息、修…

Redis Sentinel(哨兵)详解

目录 一&#xff1a;什么是Sentinel&#xff08;哨兵&#xff09; 二&#xff1a;Sentinel有什么用 1.监控 2.故障转移 3通知 4.配置提供 三&#xff1a;Sentinel如何检测master节点宕机 1.主观下线 2.客观下线 四&#xff1a;Sentinel是如何选举出新的master 1.s…

SpringBoot3整合ELK实现日志可视化

SpringBoot整合ELK实现日志可视化 一、环境准备 Elasticsearch、Logstash、Kibana,组合起来可以搭建线上日志系统 ELK中各个服务的作用 Elasticsearch:用于存储收集到的日志信息&#xff1b; Logstash:用于收集日志&#xff0c;SpringBoot应用整合了Logstash以后会把日志发…

golang面试

算法&#xff1a; 1.提取二进制位最右边的 r i & (~i 1) 2.树上两个节点最远距离&#xff0c;先考虑头结点参与不参与。 3.暴力递归改dp。 1.确定暴力递归方式。 2.改记忆化搜索 3.严格表方式&#xff1a; 分析可变参数变化范围&#xff0c;参数数量决定表维度、 …

【文心智能体】通过工作流使用知识库来实现信息查询输出,一键查看旅游相关信息,让出行多一份信心

欢迎来到《小5讲堂》 这是《文心智能体平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 创建灵感基本配置头像名称和简介人物设定角色与目标思考路…

Android10源码刷入Pixel2以及整合GMS

一、ASOP源码下载 具体可以参考我之前发布的文章 二、下载相关驱动包 这一步很关键,关系到编译后的镜像能否刷入后运行 下载链接:Nexus 和 Pixel 设备的驱动程序二进制文件 如下图所示,将两个驱动程序上传到Ubuntu服务器,并进行解压,得到两个脚本: 下载解压后会有两…

MySQL数据的增删改查(一)

目录 新增&#xff08;create&#xff09; 插入单条记录 插入多条记录 查询&#xff08;retrieve&#xff09; 查询所有列 查询特定列 查询字段为表达式 别名 去重 排序 按单列排序 按多列排序 使用表达式或别名排序 排序NULL值 条件查询 比较运算符 逻辑运算…

【阿一网络安全】如何让你的密码更安全?(三) - 散列函数

散列函数 散列函数&#xff08;Hash Function&#xff0c;又称散列算法、哈希函数&#xff09;&#xff0c;是一种从任何一种数据中创建小的数字指纹的方法。 散列值 散列函数&#xff0c;把任意长的消息明文&#xff0c;压缩成摘要&#xff0c;使得数据量变小&#xff0c;将…

k8s 容忍和污点

文章目录 Taint作用在节点上&#xff0c;能够使节点排斥一类特定的Pod&#xff0c;也就是不能“兼容”该节点的污点的Pod。对应的Toleration作用在Pod上&#xff0c;意为容忍&#xff0c;也就是可以兼容某类污点。 给节点增加一个Taint也很简单&#xff0c;直接使用kubectl ta…

【PostgreSQL】安装及使用(Navicat/Arcgis),连接(C#)

简介 PostgreSQL 是一个功能强大的开源对象关系数据库系统 下载地址 PostgreSQL: Downloads 由于我电脑上安装的是arcgispro3.1所以需要下载对应的postgresql版本 PostgreSQL 12 对应的 PostGIS 版本主要是 3.5.0 或更高版本。 安装 一般设置为postgresql 安装扩展插件 此…

Centos如何配置阿里云的yum仓库作为yum源?

背景 Centos在国内访问官方yum源慢&#xff0c;可以用国内的yum源&#xff0c;本文以阿里云yum源为例说明。 快速命令 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.a…

《深度学习》OpenCV轮廓检测 模版匹配 解析及实现

目录 一、模型匹配 1、什么是模型匹配 2、步骤 1&#xff09;提取模型的特征 2&#xff09;在图像中查找特征点 3&#xff09;进行特征匹配 4&#xff09;模型匹配 3、参数及用法 1、用法 2、参数 1&#xff09;image&#xff1a;待搜索对象 2&#xff09;templ&am…

【2025】基于python的网上商城比价系统、智能商城比价系统、电商比价系统、智能商城比价系统(源码+文档+解答)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…