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

Java中快速排序的优化技巧:随机取样、三数取中和插入排序

目录

快速排序基础

优化1:随机取样

优化2:三数取中

优化3:插入排序

总结:


快速排序(Quick Sort)是一种高效的排序算法,它的平均时间复杂度为O(n log n)。然而,在某些情况下,快速排序可能表现不佳,特别是在输入数据近乎有序或包含大量重复元素时。为了解决这些问题,我们可以对快速排序进行一些优化。本文将介绍Java语言中如何使用随机取样、三数取中和插入排序等优化技巧来提高快速排序的性能。

快速排序基础

快速排序的基本思想是选择一个基准元素(pivot),将数组分成两个子数组,小于基准的元素放在左边,大于基准的元素放在右边,然后对这两个子数组递归地进行排序。

public static void quickSort(int[] arr){quick(arr,0,arr.length-1);
}private static void quick(int[] arr,int start,int end){if (start>=end){return;}int pivot=partition(arr,start,end);quick(arr,start,pivot-1);quick(arr,pivot+1,end);
}private static int partition(int[] arr,int left,int right ){int tmp=arr[left];while (left<right){while (left<right&&arr[right]>=tmp){right--;}arr[left]=arr[right];while (left<right&&arr[left]<=tmp){left++;}arr[right]=arr[left];}arr[left]=tmp;return left;
}

优化1:随机取样

在快速排序中,如果每次选择的基准元素都是数组的最左边或最右边,那么在输入数据接近有序时,性能会下降。为了解决这个问题,我们可以随机选择基准元素。

private static void quick(int[] arr,int start,int end){if (start>=end){return;}int randomIndex = getRandomIndex(start, end);swap(arr, start, randomIndex);int pivot=partition(arr,start,end);quick(arr,start,pivot-1);quick(arr,pivot+1,end);
}
public int getRandomIndex(int low, int high) {Random rand = new Random();return rand.nextInt(high - low + 1) + low;
}

随机选择基准元素可以减小快速排序在特定输入下的性能波动。

优化2:三数取中

另一个性能优化的方法是选择中位数作为基准元素。这可以避免最坏情况下的快速排序性能下降。

private static void quick(int[] arr,int start,int end){if (start>=end){return;}//三数取中法int index=midThree(arr,start,end);int tmp=arr[start];arr[start]=arr[index];arr[index]=tmp;int pivot=partition1(arr,start,end);quick(arr,start,pivot-1);quick(arr,pivot+1,end);
}
private static int midThree(int[] arr,int left,int right){int mid=(left+right)/2;if (arr[left]<right){if (arr[mid]<arr[left]){return left;}else if (arr[mid]>arr[right]){return right;}else {return mid;}}else {//arr[left]>rightif (arr[mid]<arr[right]){return right;}else if (arr[mid]>arr[left]){return left;}else {return mid;}}
}

三数取中的方法可以有效地避免快速排序的最坏情况,提高了算法的稳定性。

优化3:插入排序

对于小规模的数组,快速排序的递归开销可能会变得显著。在这种情况下,使用插入排序可以提高性能。

private static void quick(int[] arr,int start,int end){if (start>=end){return;}if(end-start+1<=14){//插入排序insertSort2(arr, start, end);return;}//三数取中法int index=midThree(arr,start,end);int tmp=arr[start];arr[start]=arr[index];arr[index]=tmp;int pivot=partition(arr,start,end);quick(arr,start,pivot-1);quick(arr,pivot+1,end);}public static void insertSort2(int[] arr,int start,int end){for (int i = start; i <= end; i++) {int temp=arr[i];int j=i-1;while (j>=0&&arr[j]>temp){arr[j+1]=arr[j];j--;}arr[j+1]=temp;}}private static int midThree(int[] arr,int left,int right){int mid=(left+right)/2;if (arr[left]<right){if (arr[mid]<arr[left]){return left;}else if (arr[mid]>arr[right]){return right;}else {return mid;}}else {//arr[left]>rightif (arr[mid]<arr[right]){return right;}else if (arr[mid]>arr[left]){return left;}else {return mid;}}}private static int partition(int[] arr,int left,int right ){int tmp=arr[left];while (left<right){while (left<right&&arr[right]>=tmp){right--;}arr[left]=arr[right];while (left<right&&arr[left]<=tmp){left++;}arr[right]=arr[left];}arr[left]=tmp;return left;}

注意:代码里的小于14长度是我自己规定的,各位友友可以自己定义小数组的长度~~

插入排序在小规模数组上的性能通常比快速排序更好~~

总结:

在Java中,优化快速排序的方法包括随机取样、三数取中和插入排序。这些优化可以改善快速排序在各种输入情况下的性能表现,使其成为一种强大而高效的排序算法。通过合理地选择这些优化技巧,可以根据实际需求来提高算法的性能。喜欢的友友可以关注一下博主噢🤩

相关文章:

Java中快速排序的优化技巧:随机取样、三数取中和插入排序

目录 快速排序基础 优化1&#xff1a;随机取样 优化2&#xff1a;三数取中 优化3&#xff1a;插入排序 总结&#xff1a; 快速排序&#xff08;Quick Sort&#xff09;是一种高效的排序算法&#xff0c;它的平均时间复杂度为O(n log n)。然而&#xff0c;在某些情况下&…...

【leetcode 力扣刷题】删除字符串中的子串or字符以满足要求

删除字符串中的子串或者字符以满足题意要求 1234. 替换子串得到平衡字符串680. 验证回文串917. 仅仅反转字母 1234. 替换子串得到平衡字符串 题目链接&#xff1a;1234. 替换子串得到平衡字符串 题目内容&#xff1a; 题目中给出了平衡字符串的定义——只有’Q’&#xff0c;…...

【Unity基础】3.脚本控制物体运动天空盒

【Unity基础】3.脚本控制物体运动&天空盒 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity基础系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;搭建开发环境 &#xff08;1&#xff09;下载visual studio 在我们下载unity编译器的时候&…...

Spring MVC拦截器

拦截器&#xff08;Interceptor&#xff09;是 Spring MVC 提供的一种强大的功能组件。它可以对用户请求进行拦截&#xff0c;并在请求进入控制器&#xff08;Controller&#xff09;之前、控制器处理完请求后、甚至是渲染视图后&#xff0c;执行一些指定的操作。 在 Spring MV…...

ClickHouse的Join算法

ClickHouse的Join算法 ClickHouse是一款开源的列式分析型数据库&#xff08;OLAP&#xff09;&#xff0c;专为需要超低延迟分析查询大量数据的场景而生。为了实现分析应用可能达到的最佳性能&#xff0c;分析型数据库&#xff08;OLAP&#xff09;通常将表组合在一起形成一个…...

java面试题-RabbitMQ面试题

RabbitMQ面试题 面试官&#xff1a;RabbitMQ-如何保证消息不丢失 候选人&#xff1a; 嗯&#xff01;我们当时MYSQL和Redis的数据双写一致性就是采用RabbitMQ实现同步的&#xff0c;这里面就要求了消息的高可用性&#xff0c;我们要保证消息的不丢失。主要从三个层面考虑 第一…...

数据仓库-核心概念

数据仓库 数据仓库&#xff0c;英文名称为Data Warehouse&#xff0c;可简写为DW或DWH。数据仓库&#xff0c;是为企业所有级别的决策制定过程&#xff0c;提供所有类型数据支持的战略集合。它是单个数据存储&#xff0c;出于分析性报告和决策支持目的而创建。为需要业务智能的…...

java中的实体类

在Java与数据库交互时&#xff0c;设计实体类有以下几个原因&#xff1a; 1、对象关系映射&#xff08;ORM&#xff09;&#xff1a;实体类提供了一种将数据库中的表映射为Java对象的方式。这样&#xff0c;开发人员可以使用面向对象的方式操作数据库&#xff0c;而无需编写大…...

使用Puppeteer爬取地图上的用户评价和评论

导语 在互联网时代&#xff0c;获取用户的反馈和意见是非常重要的&#xff0c;它可以帮助我们了解用户的需求和喜好&#xff0c;提高我们的产品和服务质量。有时候&#xff0c;我们需要从地图上爬取用户对某些地点或商家的评价和评论&#xff0c;这样我们就可以分析用户对不同…...

GLSL ES着色器语言 使用矢量和矩阵的相关规范

目录 矢量和矩阵类型 下面是声明矢量和矩阵的例子&#xff1a; 赋值和构造 矢量构造函数 矩阵构造函数 构造矩阵的几种方式 访问元素 . 运算符 矢量的分量名 &#xff3b; &#xff3d;运算符 运算符 矢量和矩阵可用的运算符 矢量和矩阵相关运算 矢量和浮点数的…...

Himall商城- web私有方法

目录 1 Himall商城- web私有方法 1.1 /// 获取售价 1.1.1 //商品批量销售价 1.1.2 //获取组合购的价格 Himall商城- web私有方法 #region web私有方法 /// <summary> /// 获取售价 /// <para>己计算会员折</para> /// </summary> /// <para…...

Spring Boot 整合 Redis,使用 RedisTemplate 客户端

文章目录 一、SpringBoot 整合 Redis1.1 整合 Redis 步骤1.1.1 添加依赖1.1.2 yml 配置文件1.1.3 Config 配置文件1.1.4 使用示例 1.2 RedisTemplate 概述1.2.1 RedisTemplate 简介1.2.2 RedisTemplate 功能 二、RedisTemplate API2.1 RedisTemplate 公共 API2.2 String 类型 A…...

Tomcat 接收请求并传递给工作线程池流程

文章目录 Tomcat 接收请求并传递给工作线程池流程接收 socket 连接 org.apache.tomcat.util.net.SocketProcessorBase#reset结论 Tomcat 接收请求并传递给工作线程池流程 接收 socket 连接 有两个线程 http-nio-8080-ClientPoller-0/1 &#xff08;下文称为 clientPoller&…...

在Linux系统上用C++将主机名称转换为IPv4、IPv6地址

在Linux系统上用C将主机名称转换为IPv4、IPv6地址 功能 指定一个std::string类型的主机名称&#xff0c;函数解析主机名称为IP地址&#xff0c;含IPv4和IPv6&#xff0c;解析结果以std::vector<std::string>类型返回。解析出错或者解析失败抛出std::string类型的异常消…...

【硬件设计】硬件学习笔记二--电源电路设计

硬件学习笔记二--电源电路设计 一、LDO设计1.1 LDO原理1.2 LDO参数1.3 应用 二、DC-DC设计2.1 DC-DC原理2.2 DC-DC参数介绍2.4 DC-DC设计要点2.5 DC-DC设计注意事项 写在前面&#xff1a;本篇笔记来自王工的硬件工程师培训课程&#xff0c;想要学硬件的同学可以去腾讯课堂直接搜…...

day34 集合总结

集合总结 一、概述 作用&#xff1a;存储对象的容器&#xff0c;代替数组的&#xff0c;使用更加的便捷 所处的位置&#xff1a;java.util 体系结构 二、Collection 内部的每一个元素都得是引用数据类型 常用方法 add(Object o) 添加元素 addAll(Collection c) 将指定集…...

【JAVA】 图书管理系统(javaSE简易版 内含画图分析) | 期末大作业课程设计

作者主页&#xff1a;paper jie 的博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JAVA》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&…...

区块链技术与应用 - 学习笔记3【比特币数据结构】

大家好&#xff0c;我是比特桃。本系列笔记只专注于探讨研究区块链技术原理&#xff0c;不做其他违反相关规定的讨论。 区块链技术已被纳入国家十四五规划&#xff0c;在“加快数字发展 建设数字中国”篇章中&#xff0c;区块链被列为“十四五”七大数字经济重点产业之一&#…...

Ubuntu下高效Vim的搭建(离线版)

软件界面 可以看到界面下方有一些常用提示信息&#xff1a;文件路径、format、文件类型、光标所在的坐标(x,y)、进度条(百分比)、日期时间 会提示已定义的变量名词(快速补全) 搭建方法 下载资源文件 把Vim 和 .vimrc 拷贝到家目录下&#xff0c;并执行tar -xvf Vim 即可。 …...

阿里云和腾讯云2核2G服务器价格和性能对比

2核2G云服务器可以选择阿里云服务器或腾讯云服务器&#xff0c;腾讯云轻量2核2G3M带宽服务器95元一年&#xff0c;阿里云轻量2核2G3M带宽优惠价108元一年&#xff0c;不只是轻量应用服务器&#xff0c;阿里云还可以选择ECS云服务器u1&#xff0c;腾讯云也可以选择CVM标准型S5云…...

python基于微信小程序的直播带货商品数据分析系统的爬虫可视化

目录需求分析与系统架构设计微信小程序数据爬取方案数据存储与清洗数据分析与可视化系统集成与部署注意事项项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作需求分析与系统架构设计 明确系统目标为爬取微信小程序直播带货商品数…...

AI巨头集体“铸Token”:从ChatGPT到“数字员工工厂”,程序员的狂欢还是危机?

想象一下&#xff1a;你早上醒来&#xff0c;打开电脑&#xff0c;不是自己敲代码&#xff0c;而是对着一只“龙虾”说&#xff1a;“帮我把昨天的Bug修了&#xff0c;顺便给老板发份周报。” 这不是科幻——2026年3月&#xff0c;这事儿正在发生。 全球头部科技公司突然集体“…...

深度残差收缩网络(pytorch)框架+时序信号转格拉姆角场二维图; 将时序信号转换为二维图

深度残差收缩网络&#xff08;pytorch&#xff09;框架时序信号转格拉姆角场二维图&#xff1b; 将时序信号转换为二维图&#xff0c;使用深度残差收缩网络进行特征提取&#xff1b;训练后保存训练文件便于二次使用。 代码清晰&#xff0c;模型、训练、数据读取分类明显&#x…...

解锁汽车ECU诊断新可能:ECUBus-Pro开源工具的全场景应用指南

解锁汽车ECU诊断新可能&#xff1a;ECUBus-Pro开源工具的全场景应用指南 【免费下载链接】ECUBus ECU bus tool, UDS over CAN, CAN-FD, Ethernet and so on. 项目地址: https://gitcode.com/gh_mirrors/ec/ECUBus ECUBus-Pro是一款功能强大的开源汽车ECU开发工具&#…...

3MF格式与Blender从入门到精通:重塑3D打印工作流

3MF格式与Blender从入门到精通&#xff1a;重塑3D打印工作流 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 概念解析&#xff1a;为什么3MF正在取代STL成为行业新标准 …...

UReport2实战:如何优雅地导出多Sheet页报表(动态/静态分页全解析)

UReport2实战&#xff1a;如何优雅地导出多Sheet页报表&#xff08;动态/静态分页全解析&#xff09; 在数据驱动的商业环境中&#xff0c;报表导出功能已成为企业级应用的标配需求。当面对海量数据时&#xff0c;传统的单Sheet页Excel导出方案往往导致文件臃肿、查阅困难。URe…...

ThinkPad装Win10企业版后,手把手教你用PowerShell搞定Lenovo Vantage(附依赖包下载)

ThinkPad安装Win10企业版后手动部署Lenovo Vantage的完整指南 当你在ThinkPad上安装了纯净的Windows 10企业版系统后&#xff0c;可能会发现无法通过常规方式安装Lenovo Vantage这款官方管理工具。本文将详细介绍如何通过PowerShell命令手动安装Lenovo Vantage及其所有必需的依…...

开源大模型落地趋势一文详解:Youtu-2B轻量化实践

开源大模型落地趋势一文详解&#xff1a;Youtu-2B轻量化实践 最近和不少做AI应用的朋友聊天&#xff0c;大家普遍有个感受&#xff1a;大模型是好&#xff0c;但用起来太“重”了。动辄几十上百G的模型&#xff0c;对算力要求高&#xff0c;部署成本也大&#xff0c;很多中小团…...

科哥CAM++镜像入门指南:快速搭建中文语音识别系统

CAM镜像入门指南&#xff1a;快速搭建中文语音识别系统 1. 系统概述 CAM说话人识别系统是一个基于深度学习的声纹识别工具&#xff0c;由科哥封装为易用的Docker镜像。它能快速判断两段语音是否来自同一说话人&#xff0c;并提取语音特征向量&#xff0c;适用于身份验证、语音…...

如何快速下载Google Drive受保护PDF:终极免费解决方案指南

如何快速下载Google Drive受保护PDF&#xff1a;终极免费解决方案指南 【免费下载链接】Google-Drive-PDF-Downloader 项目地址: https://gitcode.com/gh_mirrors/go/Google-Drive-PDF-Downloader 你是否经常遇到Google Drive中那些"仅查看"权限的PDF文件&am…...