排序算法——快速排序:普通快排与双路快排

server/2024/10/20 8:48:53/

快速排序:

普通快排:

选取待排序数组的首或尾元素作为枢轴(就是base,我们选出来的比较的数),大于base的放右边,小于base的放左边。

public void quickSort(int[] nums, int low, int high) {if (low >= high) return;int base = nums[low];//基准元素int lIndex = low, rIndex = high;//lIndex是需要交换的最左元素下标,rIndex是最右元素下标while (lIndex < rIndex) {while(lIndex < rIndex && nums[rIndex] >= base) rIndex--;while(lIndex < rIndex && nums[lIndex] <= base) lIndex++;if(lIndex < rIndex) {swap(nums, lIndex, rIndex);}}//经过以上处理得到的lIndex就是base应该放置的下标swap(nums, lIndex, low);quickSort(nums, low, lIndex - 1);//分别对base的左右两侧快排quickSort(nums, lIndex + 1, high);
}
private static void swap(int[] nums, int index1, int index2) {int temp = nums[index1];nums[index1] = nums[index2];nums[index2] = temp;
}

很显然对于普通的快排来说只能处理大于base和小于base的情况,对于等于base的情况我们是做的模糊处理(哪边先碰到算哪边的),所以在待排序数组中元素重复度比较高的情况下会退化为O(n^2)。如:4,4,4,4,4,1

我们每次只能一个元素一个元素的拆开,而不是理想情况一半一半的拆,为了处理以上情况有了双路快排。

双路快排:

void doubleQuicklySort(int[] nums, int low, int high) {if(low >= high) return;//index1是左往右(除base外)第一个大于等于base的数的下标//index2是右往左第一个小于等于base的数的下标int base = nums[low], index1 = low + 1, index2 = high;while(true) {while(index1 < index2 && nums[index2] > base) index2--;while(index1 < index2 && nums[index1] < base) index1++;if(index1 >= index2) break;swap(nums, index1, index2);//交换完后我们认为符合左右两边的规律性,所以下一次开始的时候需要从两个下标的后一位开始index1++;index2--;}/*因为上面while中的交换是为了让nums[low](第一个>=base的)和nums[index2](第一个<=base的互换)来保证左右两边的规律性,但是如果在上面第一个while中对于index2的更新因为不满足(index1 < index2)的条件而退出,不是因为不满足(nums[index2] > base),所以就有可能导致index2指向的数仍然是>=base的所以就没必要调换  eg:3 4 4 5 6可以用这个例子理解*/if(nums[index2] < base)swap(nums, low, index2);doubleQuicklySort(nums, low, index2-1);doubleQuicklySort(nums, index2, high); 
}

http://www.ppmy.cn/server/127415.html

相关文章

微服务(Microservices),服务网格(Service Mesh)以及无服务器运算Serverless简单介绍

文章目录 什么是微服务?一、定义与特点二、优势三、组件与架构四、应用场景五、挑战与解决方案什么是服务网格?一、定义与特点二、核心组件三、主要功能四、实现工具五、应用场景六、优势与挑战什么是Serverless?一、定义与特点二、主要领域三、优势四、应用场景五、挑战三者…

Redis数据库与GO(二):list,set

一、list&#xff08;列表&#xff09; list&#xff08;列表&#xff09;是简单的字符串列表&#xff0c;按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。List本质是个链表&#xff0c; list是一个双向链表&#xff0c;其元素是有序的&#xff0c;元…

PMP--三模--解题--151-160

文章目录 14.敏捷--仆人式领导--在敏捷环境中&#xff0c;项目经理充当仆人式领导&#xff0c;其工作重点转变为引导需要帮助的人&#xff0c;促进团队的合作&#xff0c;保持与干系人的需要一致。151、 [单选] 两个分布在不同地方的团队在同一个项目上。相比A团队&#xff0c;…

稿简单认识redis -2 java中的使用

1.idea配置 Jedis: 一款java操作redis数据库的工具. 1.1. 下载jedis的jar包 1 添加到 lib 目录 右键 后添加为库 2 配置maven项目在 pom.xml文件添加依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><v…

[Uninstall] 软件彻底卸载工具的下载及详细安装使用过程(附有下载文件)

一般软件安装的有问题&#xff0c;或者想重新安装其他版本就需要将原来的版本删除干净&#xff0c;但常常删不干净&#xff0c;本文分享一个软件彻底卸载工具&#xff0c;完成彻底卸载软件的工作 下载链接在文末 下载压缩包后解压 &#xff01;&#xff01;安装路径不要有中文…

足球青训俱乐部后台:Spring Boot开发策略

4 系统设计 4.1 系统架构设计 B/S系统架构是本系统开发采用的结构模式&#xff0c;使用B/S模式开发程序以及程序后期维护层面需要的经济成本是很低的&#xff0c;用户能够承担得起。使用这样的模式开发&#xff0c;用户使用起来舒心愉悦&#xff0c;不会觉得别扭&#xff0c;操…

《无机杀手》制作团队选择Blender的原因分析

《无机杀手》&#xff08;Murder Drones&#xff09;是一部备受欢迎的动画短片&#xff0c;其制作团队选择使用Blender软件进行制作&#xff0c;这一选择背后有着多方面的原因。【成都渲染101--blender渲染农场邀请码6666提供文案参考】 开源且免费 Blender是一个开源且免费的…

RIP路由(已被淘汰)

一、rip 路由原理 RIP&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09;早期的动态路由协议&#xff0c;被广泛应用于TCP/IP网络中&#xff0c;尤其是在中小型网络中。基于距离矢量&#xff08;Distance-Vector&#xff09;算法来计算到达目的网络…