《算法导论的Java实现》 8 快速排序

java实现稳定的快速排序 一、思路 一般的快速排序为不稳定的,如果实现稳定的快速排序,则需要在partition过程中进下特殊的处理,其中一种方法是另为申请一段空间B,在原来的数据空间A中,选取第一个元素flag为中间数据,首先遍历空间A,将所有小于flag的元素依次放入空间B中,然后将flag放入B中,再次遍历空间B,将所有大于等于flag的元素依次放入空间B中,最后重新将空间B的数据全部拷贝到空间A中。 二、代码 阅读详情

8 快速排序

8.1 对快速排序的描述

快速排序是基于“分治算法”的。在《1.3.1 分治算法》里面已经介绍过的,就不重复讲了。只要记住基于“分治”的算法,一般都是主函数是个“分治”语句(if…else…),分治块里面一般是调用本身的递归。

伪代码:



Java代码:




输出:
1 2 3 4 5 6 7 8


code后感
快速排序已经被讨论得太多。所以,反而没有什么可写的了。PARTITION函数如何对子数组进行划分,在《算法导论》里面说得也很清楚。
值得玩味的是,《算法导论》第一版里面的伪代码用while来做循环,第二版是for来循环。伪代码我是照英文版第二版来的,所以,包括Java代码都用for来循环了。我没看出效率上两者有什么区别。
但是可读性上,while做循环的程序,就像一直以来的教科书上的样子,i和j像2个指针不断往中间靠,直到重叠在一起。似乎,可以使快速排序更容易理解一点。

细心的人,还会注意到下面的不同:
伪代码:QUICKSORT(A, p, q - 1)
我的Java代码:quickSort(a, c, p, q);
也就是,分治时,边界不同。为什么会这样?说起来有点搞。
事实上,第一版的伪代码就是:QUICKSORT(A, p, q)。是不是第二版的伪代码出错了呢?这点我也没有仔细分析。quickSort(a, c, p, q)配合for循环的PARTITION函数,再考虑到数组下标的边界情况,我的代码可以正常运行。更细的研究,没有太大的必要,都是一些加一减一的问题了。



8.3 快速排序的随机化版本
8.2 快速排序的性能一节里面,没有伪代码,被我跳过。但是,里面讲到快速排序的最坏情况,会退化成Θ(n^2),类似于冒泡插入等排序了。为了不依赖于样本(被排序的原始序列),PARTITION执行前追加一步随机处理,就是将p到r之间随机抽取一个值i,交换A[r]和A[i]。


伪代码:



Java代码:


测试代码:

 


输出:
1 2 3 4 5 6 7 8

code后感
随机化版本本身没有什么好说的,快速排序的变种之一。
但是变种的出现,是个有趣的话题。
《算法导论》通读后,如果你大部分都能搞懂了,那么我恭喜你,可以称为一个合格的程序员了。但是如果仅仅通读正文的话,那么我就很遗憾的告诉你,太可惜了,《算法导论》这本书就连习题部分都是很牛叉的。
比方说这里的STOOGE-SORT排序
伪代码:

算法导论-java 算法导论:概述基本算法!对一个编程人员来说,算法很重要,一个好的算法,可以让你的软件运行效果好 立即下载

相关推荐

算法导论java

里面包含了很基础的算法知识,相信你能通过其中的内容学到一定的知识!

《算法导论》-分治策略-最大子数组问题,理解与实现(Java,C++)

关于最大子数组问题如果采用暴力破解法将会很容易实现,但是暴力破解复杂度可想而知,所有如果采用分治策略可以大大减少运行时间,下面将分析分治策略如何解决这个问题,通过伪代码来表示执行过程,并用Java,C++进行实现.

qq_44242804的博客 794

算法导论第三版完整版答案

算法导论第三版答案,算是比较全的版本 中文答案

算法导论 java版_《算法导论》第二章demo代码实现(Java版)

《算法导论》第二章demo代码实现(Java版)前言表示晚上心里有些不宁静,所以就写一篇博客,来缓缓。囧拜读《算法导论》这样的神作,当然要做一些练习啦。除了练习题与思考题那样的理论思考,也离不开编码的实践。所以,后面每个章节,我都会尽力整理出章节中涉及的算法的Java代码实现。二分查找算法实现package tech.jarry.learning.test.algorithms.binarysea...

weixin_29782509的博客 260

算法导论 经典的参考资料 必看

学习算法必看的书籍,算法导论,很好的基础课本,初学者必看。

算法导论部分实现代码Java版

NULL 博文链接:https://qianjigui.iteye.com/blog/286520

《算法导论》-分治策略,分治排序(Java,C++)

简单的来说就是将原问题分解为规模较小的子问题,几个规模较小的子问题类似于原问题,递归的求解子问题,将子问题合并,建立原问题的解。

qq_44242804的博客 421

算法导论第三版(中文版)-1.rar

本书深入浅出,全面地介绍了计算机算法。对每一个算法的分析既易于理解又十分有趣,并保持了数学严谨性。本书的设计目标全面,适用于多种用途。涵盖的内容有:算法在计算中的作用,概率分析和随机算法的介绍。本书专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。本书还介绍了对强连通子图算法正确性的证明,对哈密顿回路和子集求和问题的NP完全性的证明等内容。全书提供了900多个练习题和思考题以及叙述较为详细的实例研究。 本书内容丰富,对本科生的数据结构课程和研究生的算法课程都是很实用的教材。本书在读者的职业生涯中,也是一本案头的数学参考书或工程实践手册。

快速排序(算法导论)java实现

  快速排序(QuickSort)是对冒泡排序(BubbleSort)的一种改进。排序效率在同为O(N*logN)的几种排序方法中效率较高,且快速排序算法是 分治策略的典型应用。时间复杂度:O(N*logN)。 版本一: 算法的关键部分是Partition过程,它实现了对子数组 A[p...r] 的原址重排。 /** * 快速排序一,算法导论P95 * @author Ad...

SpringRolls的博客 394

Java全栈AI视频生成开发实战:从DeepSeek接入到剪映自动化(附完整源码)

【代码】Java全栈AI视频生成开发实战:从DeepSeek接入到剪映自动化(附完整源码)

weixin_39169967的博客 4145

方案设计之亿级排行榜方案设计

该方案通过 “Redis Zset 为核心 + 分治策略为骨架 + 多级优化为细节”,在亿级用户场景下实现了:本质是将 “亿级大问题” 拆解为 “千万级小问题”,用分布式思想和精细化设计平衡性能、可用性与成本。

shine0312的专栏 1100

快速排序算法(java实现)

基本思想 快速排序是一种采用分治法解决问题的一个典型应用,也是冒泡排序的一种改进。它的基本思想是,通过一轮排序将待排记录分割成独立的两部分,其中一部分均比另一部分小,则可分别对这两部分继续进行排序,已达到整个序列有序。排序的时间复杂度为 O(nlogn),相比于简单排序算法,运算效率大大提高。 算法步骤 从序列中取出一个数作为中轴数; 将比这个数大的数放到它的右边,小于或等于他的数放到它的左边; 再对左右区间重复第二步,直到各区间只有一个数。 例如,对以下 10..

qq_45954420的博客 1万+

硬件测试入门--环路响应(Bode)测试

环路分析的一个重要作用就是分析开关电源的稳定性。扫频测试原理主要是给开关电源电路注入一个频率变化的正弦信号,测量开关电源在频域上的特性,通过分析穿越频率、增益裕度和相位裕度来判断环路是否稳定,可以为电子工程师设计稳定的控制电路提供直观的数据。开关电源的稳定性关系到整个应用系统的可靠性,利用伯德图可以看出在不同频率下系统增益的大小和相位。通过伯德图来对开关电源的环路稳定性进行判断和分析已经成为评估开关电源可靠性必不可少的方法。

songninging的博客 1万+

快速排序——算法导论(8)

1. 算法描述 快速排序(quick-sort)与前面介绍的归并排序(merge-sort)(见算法基础——算法导论(1))一样,使用了分治思想。下面是对一个一般的子数组A[p~r]进行快速排序的分治步骤: ① 分解:数组A[p~r]被划分为两个子数组A[p~q]和A[q+1~r],使得A[q]大于等于A[p~q]中的每个元素,且小于等于A[q+1~r]中的每个元素。...

dayin201608的博客 287

PySpark 本地开发环境搭建与实践

本文详细介绍了 PySpark 本地开发环境的搭建过程,包括 JDK、Hadoop、Anaconda、PySpark 的安装以及 Pycharm 工程的创建。同时,深入讲解了代码编写、本地开发案例(如 WordCount、处理特殊分隔符、读取 hdfs 数据、获取外部变量)、Spark 程序的监控和 local 模式下结果文件数量问题等内容。通过掌握这些知识和技能,读者可以在 Windows 本地环境中高效地进行 PySpark 开发,处理大规模数据,解决实际业务中的数据分析和处理问题。

天冬忘忧的博客 3012

Silvaco TCAD | 从极化效应到高频开关:GaN HEMT仿真设计与性能验证

本文深入探讨了使用Silvaco TCAD进行GaN HEMT仿真设计与性能验证的关键技术。从极化效应到高频开关特性,详细解析了2DEG形成机制、器件结构设计优化及高频特性仿真技巧,帮助工程师提升GaN HEMT的性能与可靠性。通过实战案例展示了如何通过仿真优化击穿电压和导通电阻,实现开关品质因数的显著提升。

weixin_30872337的博客 484

快速排序Java代码简洁实现

学习过数据结构的同学们都知道,快速排序算法是一种时间复杂度为O(nlogn)的排序算法,在各种排序算法中算是较为高效的方法,企业面试中也经常有手撕快排的环节。本文将阐述算法的基本思想,并用Java代码的形式实现快速排序代码。 算法思想 快速排序主要采用分治的基本思想,每次将一个位置上的数据归位,此时该数左边的所有数据都比该数小,右边所有的数据都比该数大,然后递归将已归位的数据左右两边再次进行快...

技术进阶之路 4352

【MDC开发者实战】多传感器融合算法在自动驾驶中的配置与优化

本文详细介绍了华为MDC平台在自动驾驶中多传感器融合算法的配置与优化实践。通过前融合与后融合技术,结合摄像头、激光雷达和毫米波雷达的数据,提升感知精度与可靠性。文章还分享了ARXML配置、标定技巧、算法调优及性能优化等实战经验,帮助开发者高效实现自动驾驶系统的传感器融合。

weixin_29214199的博客 515

快速排序Java实现

快速排序 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 算法描述 快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下: 从数列中挑出一个元素,称为“基准”(pivot); 重新排序数列,所有元素比基准值小的摆放在基准前面,所有...

YelloJesse的博客 5661

Oracle EBS R12.2 安装 -- Step by Step

Oracle EBS R12.2 安装 -- Step by Step

Albert Tan DBA之路 1512

7、刚度矩阵与弹簧元素:有限元分析的核心

本文深入探讨了有限元分析中的核心概念——刚度矩阵与弹簧元素。详细介绍了刚度矩阵的定义、构建方法及其对称性、正定性和稀疏性等性质,同时解析了弹簧和阻尼器元素的特性及其在模拟复杂系统中的应用,如液压缸、减震器等。通过结合刚度矩阵与弹簧元素,可以提高结构模型的精度并模拟复杂的工程系统。文章还讨论了优化策略、验证流程、误差分析及实际应用案例,展示了这些技术在桥梁分析、汽车悬挂系统等领域的重要作用,并展望了其在未来新材料、智能结构和数字孪生技术中的发展潜力。

nice1的博客 235

算法导论的Java实现----7. 快速排序

/* * 快速排序 */ import java.util.Comparator; public class QuickSort { public static int partition(T[] a, Comparator c, int p,int r) { T t = a[r-1]; int i = p-1; for(int j=p;j<r-1;j++) {

沉默时光 1027

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

快速排序(java实现)

高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。 假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放...

大数据指北 31万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

java如何实现快速排序

java如何实现快速排序下面简述一下快速排序的基本原理基本原理下面是具体的代码实现 下面简述一下快速排序的基本原理 基本原理 我们都知道快速排序是冒泡排序的扩展,顾名思义快速排序的优点在于“快”,首先我们得先在一个数组中选定基数,如下面这组数组: 5,3,7,8,6,1,2,4,9,10 一般我们会选取数组第一个值为基数,也就是5 5,3,7,8,6,1,2,4,9,10 5 我们将数组的首端定义...

海南小黑仔的博客 680

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

JAVA实现-快速排序

JAVA实现-快速排序 高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。 假设我们现在对“6 1 2 7 9 3 4 5 ...

杨的博客 794

Java 快速排序_JAVA 实现快速排序

高效的分治排序快速排序是冒泡排序的改进版,是目前已知的最快的排序方法。该排序算法的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。优点:极快,数据移动少;缺点:不稳定。算法实现假设我们现在要对{5,7,2,1,9,10,4,6,3,8}这个数组进行快速排序,我们应该怎么怎...

weixin_42564147的博客 1350
上一篇: 《算法导论的Java实现》 7 堆排序
下一篇: 《算法导论的Java实现》 9 线性时间排序
chen09
博客等级 码龄19年 158粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值