快速排序与快速选择

2023-10-26

快速排序算法就是将一列无序的数字排成有序,通过使用分治法,快速排序能够在O(nlog(n))的时间内完成,相比堆排序等其他也是O(nlog(n))复杂度的排序算法,快速排序的基数更小,因此效率也就越高。

快速选择是在快速排序的基础上,在一列无序数中快速地计算出第K大的数字,同样使用分治法。快速选择可以避免许多不必要的排序工作。

以下是快速排序的算法实现:

快速排序通过a<b,b<c则a < c的比较传递规则,通过分治法,每一次分治时都实现b左边的数都比b本身小(大),b右边的数都比b大(小),同时,将b复制到它应有的位置,通过多次递归,最后转化为两个数或者一个数的排序,从而完成正列数的排序。

快速排序需要选取并确定pivot的位置,并且pivot所在的左边的数都小于或大于pivot,pivot右边的数则相反。因此,通常将快速排序分成以下三个函数:

	public static int[] quickSort1 (int arr[]) {
		int[] temp = copyArr(arr);
		qsort1 (temp, 0, arr.length-1);
		return temp;
	}
	
	private static void qsort1 (int arr[], int start, int end) {
		if (start < end) {
			int spliter = partition1 (arr, start,  end);
			//qsort1 (arr, start, spliter); cause StackOverFlowError
			qsort1 (arr, start, spliter-1);
			//qsort1 (arr, spliter, end); cause StackOverFlowError
			qsort1 (arr, spliter+1, end);
		}
	}
	
	private static int partition1 (int arr[], int start, int end) {
		int pivot = arr[start];
		int b = start, e = end;
		while (b < e) {
			while (b < e && arr[e] <= pivot) e--;
			arr[b] = arr[e];
			while (b < e && arr[b] >= pivot) b++;
			arr[e] = arr[b];
		}
		arr[b] = pivot;
		return b;
	}

以下是快速选择的算法实现:

由于快速排序的每一次排序都实现了pivot的位置的准确定位,并且左边的数都小于(或大于)pivot,那么,对于选择第K大(  小)的数来说,只要和pivot的位置比较一下,如果K比pivot的位置小,则第K大的数一定在pivot的左边,只需要对pivot左边的数再进行一次或多次快速排序就可以找到答案了。

	public static int Select1 (int arr[], int kth) {
		if (kth > arr.length) throw new ArrayIndexOutOfBoundsException("Number not enough to select!");
		int[] temp = copyArr(arr);
		quickSelect1 (temp, 0, temp.length-1, kth-1);
		return temp[kth-1];
	}
	
	private static void quickSelect1 (int arr[], int start, int end, int kth) {
		if (start < end && end >= kth) {
			int spliter = partition1(arr,start,end);
			if (spliter > start && kth < spliter) quickSelect1(arr,start,spliter-1,kth);
			if (spliter < end && kth > spliter) quickSelect1(arr,spliter+1,end,kth);
		}
	}

	private static int partition1 (int arr[], int start, int end) {
		int pivot = arr[start];
		int b = start, e = end;
		while (b < e) {
			while (b < e && arr[e] <= pivot) e--;
			arr[b] = arr[e];
			while (b < e && arr[b] >= pivot) b++;
			arr[e] = arr[b];
		}
		arr[b] = pivot;
		return b;
	}

快速排序的注意点:

1. 快速排序一定要注意,分治递归的时候边界不能有重合。

2. 快速排序每一趟都需要确定pivot的位置,如果仅仅只是比较,但是没有对pivot进行定位,虽然有交换,但是最后排出来的数还是有乱序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速排序与快速选择 的相关文章

  • Java 相当于 C# 中带有 @ 的逐字字符串

    快问 Java 中是否存在应用于字符串的 等效项 例如我可以做 c afolder afile 在 C 中 让它在处理时忽略转义字符 而不必这样做 c afolder aFile Java 有等效的吗 嗯 stackoverflow 正在逃
  • 增加字符串的最后一个字母

    这是我希望 Java 的 String 类有一个 ReplaceLast 方法的地方 但它没有 而且我的代码得到了错误的结果 我正在编写一个程序 该程序在数据结构中搜索与字符串前缀匹配的任何项目 但是 由于我使用的是迭代器 iter nex
  • 在 PLSQL Oracle 中抛出特定错误消息...在休眠中捕获?

    是否可以在 PL SQL oracle 存储过程中抛出特定的错误消息 并在调用它时在 Hibernate 中捕获它 您可以从 PL SQL 代码中抛出用户定义的错误消息 20000 到 20999 之间的错误代码保留用于用户指定的错误消息
  • 如何替换引号之间出现的任何单词

    我需要能够替换所有出现的单词 and 仅当它出现在单引号之间时 例如 将字符串中的 and 替换为 XXX This and that with you and me and others and not her and him 结果是 T
  • 将命令行参数传递给可运行的 JAR [重复]

    这个问题在这里已经有答案了 我从 Eclipse 项目构建了一个可运行的 JAR 用于处理给定的 XML 文件并提取纯文本 但是 此版本要求将该文件硬编码在代码中 有没有办法做这样的事情 java jar wiki2txt enwiki 2
  • 如何使用 mongoTemplate 实现 Mongodb Collection 的分页

    我是 mongoDb 中的菜鸟 我需要为任何特定集合实现分页 例如说 我有一个 Foo 集合 并且有一个返回 Foo 集合中所有记录的函数 public List
  • Java switch case 抛出 nullPointer 异常

    我有一个枚举声明如下 public enum Status REQ URL1 NOT URL2 GET URL3 String getURL Status String getURL this getURL getURL 我班上的一个领域
  • 从 Java 监听系统鼠标点击

    我的主要目的是计算特定应用程序上的鼠标点击次数 想象一下 我在 PC 上打开了 Microsoft Word 和 Web 浏览器 我的 Java 代码应该告诉我单击 Word 和 Web 浏览器的次数 我需要应用程序名称和点击次数 我怎样才
  • Java:使用类型参数访问私有构造函数

    这是后续这个关于java私有构造函数的问题 https stackoverflow com questions 2599440 accessing the private constructor 假设我有以下课程 class Foo
  • Spring框架中的DAO和Service层到底是什么?

    Spring框架中的DAO和Service层到底是什么 我正在寻找理论答案 就 Spring 而言 没有区别 按照惯例 您可以使用以下方式标记 DAO 类 Repository和服务 Service 前者还进行一些持久层异常转换 既然您在理
  • Java中的异常通知

    使用 Tomcat 的 Web 应用程序有什么好的异常通知系统吗 寻找与 exception notification 等价的库 这些库可作为 Rails 的插件使用 看一下http logging apache org log4j 1 2
  • TestNG 与 DataProvider 并行执行

    我有一个从数据提供者接收数据的测试 我希望此测试与数据提供者的不同值并行运行 我尝试了这样的方法 public class IndependentTest Test dataProvider dp1 threadPoolSize 3 inv
  • 从命令行将 clojure 源代码编译为类(AOT)(不使用 lein)

    我正在尝试将 clojure 源代码编译成类文件 并仅使用命令行运行它 没有 lein 也没有 可能 回复 我有 core cljsrc hello目录 src hello core clj 这是源代码 ns hello core defn
  • 尽管设置为 1.7,IntelliJ IDEA 13 仍使用 Java 1.5

    尽管在所有项目设置中指定了 JDK 1 7 包括File gt Project Structure gt Project Project SDK 则产生以下错误IntelliJ 13当尝试编译一些使用菱形运算符的简单 Java 7 代码时
  • Spring:当我的类已经用@RestController注释时,为什么我仍然应该使用@RequestBody?

    我目前正在将 Java 和 Spring 用于我的 Web 服务应用程序 我正在使用 RestController希望消除使用注释的需要 ResponseBody and RequestBody注释 不幸的是 删除 RequestBody注
  • 无法向 openfire 服务器发送消息

    我无法使用 SMACK API 向 openfire 服务器上的 XMPP 客户端发送消息 我不确定我哪里出错了 我在 gtalk 上测试了相同的代码 它工作正常 public class SenderTest public static
  • 如何在javafx中通过事件传递参数?

    我有以下示例 我想将参数 文本 与事件一起传递 当单击按钮 bla 时 我该怎么做 EventHandler
  • JPA Criteria API 任意数量的联接/子查询

    我需要使用以下实体构建相交类型查询 为了清楚起见 减少了实体 Entity and other stuff public class Member Id private Long id private String name Entity
  • 如何处理MaxUploadSizeExceededException

    MaxUploadSizeExceededException当我上传的文件大小超过允许的最大值时 会出现异常 我想在出现此异常时显示错误消息 如验证错误消息 我该如何处理这个异常 以便在 Spring 3 中执行类似的操作 Thanks 这
  • 如何在 Java 中以编程方式获取接口的所有实现的列表?

    我可以通过反思或类似的方式来做到这一点吗 我已经搜索了一段时间 似乎有不同的方法 这里总结一下 反思 https github com ronmamo reflections如果您不介意添加依赖项 该库非常受欢迎 它看起来像这样 Refle

随机推荐

  • Selenium基础用法

    目录 一 概念和自己的理解 二 安装 三 浏览器驱动 四 正真的基础上场 1 先要打开浏览器 打不开 我们后面也就做不了 万事开头先有前提 2 获取元素的方法 3 操作元素 4 浏览器操作 5 鼠标操作 6 键盘操作 7 下拉框操作 8 页
  • JDK 1.5 新特性

    文章目录 1 JDK 1 5 新特性 1 1 自动装箱和拆箱 1 1 1 什么是自动装箱和拆箱 1 1 2 自动装箱拆箱要点 1 1 3 自动装箱拆箱样例 1 1 4 自动装箱缺点 1 1 5 重载与自动装箱 1 1 6 自动拆装箱的缓存机
  • 【位图&&布隆过滤器&&海量数据面试题】

    文章目录 1 位图 2 布隆过滤器 1 位图 首先我们来看看一个腾讯的面试题 给40亿个不重复的无符号整数 没排过序 给一个无符号整数 如何快速判断一个数是否在这40亿个数中 分析 40亿个不重复整形数据 大概有160亿字节 也就是16GB
  • 数据结构单链表的创建以及简单操作

    在数据结构中 目录 一 数据节点类型结构体封装 二 创建单链表 1 创建链表 2 头部插入 3 遍历链表 4 尾部插入 5 释放链表 链表可以解决顺序表无法开辟连续空间的问题 大大提高了内存的利用率 这使我们在开发中不再局限于小型数据量的项
  • 开发岗校招求职攻略——面试准备(7.2胸有成竹-技术面技巧)

    1 前言 当你踏入面试房间的第一只脚开始 你的一举一动就都在面试官眼里和心里了 从最开始的自我介绍 到最后结束面试时的提问 都不能草率对待 下面 我根据技术面的几种常见面试形式 分别介绍一些特有的技巧 并且会在此基础上再额外介绍一些通用技巧
  • 查找已安装 npm 包的版本

    问 如何查找已安装的 node js npm 包的版本 这将打印 npm 本身的版本 npm v 这会打印一个神秘的错误 npm version 这会在注册表上打印软件包版本 即可用的最新版本 npm view version 如何获取已安
  • IDEA 连接 数据库

    IDEA 连接 数据库 一 首先确保数据库服务是打开的 使用 mysql u root p 连接数据库服务器 若不能进入到 mysql 里面则说明 没有启动服务器 使用 net start mysql 命令启动 如果 net start m
  • 攻防世界Web赛题记录

    Cat 题目 https adworld xctf org cn task answer type web number 3 grade 1 id 4658 page 2 Writeup 攻防世界 web Cat XCTF 4th WHCT
  • QT tabWidget样式表

    背景设置 QTabWidget pane border 1px solid rgba 125 250 250 160 border radius 3px background transparent 透明 margin top 1px cl
  • npm报错:xxx packages are looking for funding run `npm fund` for details(解决办法)

    报错信息 30 packages are looking for funding run npm fund for details 报错原因 这里是开发者捐赠支持的提示 打开一个github的链接之后 会显示是否需要打赏捐赠的信息 解决方案
  • LPDDR4 JEDEC标准测试实例解析--地址总线写操作

    说完DQ信号的读写测试 接下来 再来聊一聊命令及地址总线 CA Bus 的测试 由于CA bus只有一个信号流向 因此 只需要进行写操作的测试即可 如下图所示 为JEDEC标准中定义的CA相关的测试参数 接下来 将对测试项逐一进行解析 tC
  • 【直接收藏】分享 42 个常用前端布局方案

    对 CSS 布局掌握程度决定你在Web开发中的开发页面速度 随着Web技术的不断革新 实现各种布局的方式已经多得数不胜数了 本篇文章总结了四十二种CSS的常见布局 这四十二种布局可以细分为如下几类 水平居中 垂直居中 水平垂直居中 两列布局
  • centos 64 位系统安装postgresql odbc 方法

    1 64位系统下 postgresql 的psqlodbc驱动下载地址 http www postgresql org ftp odbc versions src 2 64位系统下 安装psqlodbc需要的安装包 unixODBC 2 3
  • 机器学习实验(一)—Linear Regression

    前几天做了几个机器学习的简单实验 机器学习实验二 Logistic Regression 实验一是关于简单的线性回归的实验 下面是我的实验报告的截图 直接把word的内容撸过来 格式就全乱了 没有找到解决办法 直接上图吧 也是一种办法 后面
  • 关于差速移动机器人的运动学模型推导

    预备 在机器人的运动中 经常会涉及到航向推演 下面这篇博客写的挺好的 https blog csdn net heyijia0327 article details 44983551 在学习机器人运动模型推导的时候 有看到 网上别人的推导过
  • Rabbitmq的五种模式和案例

    消息生产者p将消息放入队列 消费者监听队列 如果队列中有消息 就消费掉 消息被拿走后 自动从队列删除 隐患 消息可能没有被消费者正确处理 已经消失了 无法恢复 应用场景 聊天室 案例 1 gt 首先准备依赖
  • linux查找nigux得路径,Dzongkha localization in Linux operating

    This message was created automatically by mail delivery software A message that you sent could not be delivered to one o
  • 网关(gateway)简介与作用

    网关的英文名称 gateway 又叫做网间连接器 协议转换器 网关是在采用不同体系结构或协议的网络之间进行互通时 用于提供协议转换 路由选择 数据交换等网络兼容功能的设施 网关在传输层上以实现网络互连 是最复杂的网络互连设备 仅用于两个高层
  • Lerp 实现匀速运动

    Lerp函数在Mathf Vector3 等类中都有 用法都类似 作用都是按照百分比取得从一个值过度到另外一个值的中间值 下面说的内容针对各中类的Lerp函数都是通用的 Lerp的常见 误用 是 Update Transform posit
  • 快速排序与快速选择

    快速排序算法就是将一列无序的数字排成有序 通过使用分治法 快速排序能够在O nlog n 的时间内完成 相比堆排序等其他也是O nlog n 复杂度的排序算法 快速排序的基数更小 因此效率也就越高 快速选择是在快速排序的基础上 在一列无序数