快速排序原理及java实现

【排序算法】快速排序原理及Java实现 快速排序是我们之前学习的冒泡排序的升级,他们都属于交换类排序,都是采用不断的比较和移动来实现排序的。快速排序是一种非常高效的排序算法,它的实现,增大了记录的比较和移动的距离,将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少了总的比较次数和移动次数。同时采用“分而治之”的思想,把大的拆分为小的,小的拆分为更小的,其原理如下: 阅读详情


原文: https://blog.youkuaiyun.com/crazy_rain/article/details/1572080


原文写的好,大家去看原文  


快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。最坏情况的时间复杂度为O(n2),最好情况时间复杂度为O(nlog2n)。

   假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序。一趟快速排序的算法是:

  1)、设置两个变量I、J,排序开始的时候I:=1,J:=N;

  2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1];

  3)、从J开始向前搜索,即由后开始向前搜索(J:=J-1),找到第一个小于X的值,两者交换;

  4)、从I开始向后搜索,即由前开始向后搜索(I:=I+1),找到第一个大于X的值,两者交换;

  5)、重复第3、4步,直到I=J;

  例如:待排序的数组A的值分别是:(初始关键数据X:=49)

                  A[1]    A[2]    A[3]    A[4]    A[5]     A[6]    A[7]: 

                    49       38      65      97      76      13       27

进行第一次交换后:  27       38      65      97      76      13       49

                  ( 按照算法的第三步从后面开始找)

进行第二次交换后:  27       38      49      97      76      13       65

                 ( 按照算法的第四步从前面开始找>X的值,65>49,两者交换,此时I:=3 )

进行第三次交换后:  27       38      13      97      76      49       65

( 按照算法的第五步将又一次执行算法的第三步从后开始找)

进行第四次交换后:  27       38      13      49      76      97       65

( 按照算法的第四步从前面开始找大于X的值,97>49,两者交换,此时J:=4 )

     此时再执行第三步的时候就发现I=J,从而结束一躺快速排序,那么经过一躺快速排序之后的结果是:27       38      13      49      76      97       65,即所以大于49的数全部在49的后面,所以小于49的数全部在49的前面。

     快速排序就是递归调用此过程——在以49为中点分割这个数据序列,分别对前面一部分和后面一部分进行类似的快速排序,从而完成全部数据序列的快速排序,最后把此数据序列变成一个有序的序列,根据这种思想对于上述数组A的快速排序的全过程如图6所示:

 初始状态                       {49    38    65    97    76    13    27}   

进行一次快速排序之后划分为     {27    38    13}    49  {76    97    65}

分别对前后两部分进行快速排序   {13}   27   {38} 

                               结束        结束   {49   65}   76   {97}

                                                   49  {65}        结束

                                                       结束

                         图6   快速排序全过程

 

1)、设有N(假设N=10)个数,存放在S数组中;

2)、在S[1。。N]中任取一个元素作为比较基准,例如取T=S[1],起目的就是在定出T应在排序结果中的位置K,这个K的位置在:S[1。。K-1]<=S[K]<=S[K+1..N],即在S[K]以前的数都小于S[K],在S[K]以后的数都大于S[K];

3)、利用分治思想(即大化小的策略)可进一步对S[1。。K-1]和S[K+1。。N]两组数据再进行快速排序直到分组对象只有一个数据为止。

如具体数据如下,那么第一躺快速排序的过程是:

数组下标: 1     2     3     4     5     6     7     8     9     10

          45    36    18    53    72    30    48    93    15     36

         I                                                       J

(1)     36    36    18    53    72    30    48    93    15     45

(2)     36    36    18    45    72    30    48    93    15     53

(3)     36    36    18    15    72    30    48    93    45     53

(4)     36    36    18    15    45    30    48    93    72     53

(5)     36    36    18    15    30    45    48    93    72     53

通过一躺排序将45放到应该放的位置K,这里K=6,那么再对S[1。。5]和S[6。。10]分别进行快速排序。

    /**

     * 交换指定数组a的两个变量的值

     * @param a 数组应用

     * @param i 数组下标

     * @param j 数组下标

     */

    public static void swap(int a[], int i, int j) {

       

        if(i == j) return;

 

        int tmp = a[i];

 

        a[i] = a[j];

 

        a[j] = tmp;

 

    }

 

    /**

     *

     * @param array 待排序数组

     * @param low 数组下标下界

     * @param high 数组下标上界

     * @return pivot

     */

    public static int partition(int array[], int low, int high) {

        //当前位置为第一个元素所在位置

        int p_pos = low;

        //采用第一个元素为轴

        int pivot = array[p_pos];

        

        for (int i = low + 1; i <= high; i++) {

 

            if (array[i] < pivot) {            

               

                p_pos++;

 

                swap(array, p_pos, i); 

 

            }

 

        }

 

        swap(array, low, p_pos);

 

        return p_pos;

 

    }

    /**

     * 快速排序实现

     * @param array

     * @param low

     * @param high

     */

    public static void quickSort(int array[], int low, int high) {

 

        if (low < high) {

 

            int pivot = partition(array, low, high);

 

            quickSort(array, low, pivot - 1);

 

            quickSort(array, pivot + 1, high);

 

        }

 

    }





Pulpino SoC中挂载AXI从机接口的自定义IP说明 AXI 从机接口挂载 Pulpino SoC 调试Pulpino SoC中挂载AXI从机接口的自定义IP说明PULPion SoC介绍自定义AXI IP挂载IP挂载框图代码修改脚本修改自定义AXI IP调试C语言编写软件调试硬件调试 Pulpino SoC中挂载AXI从机接口的自定义IP说明 本篇文章主要从工程的角度描述了如何将具有AXI从机接口的自定义IP挂载到Pulpino SoC上,其中不涉及到SoC中的任何原理知识。 PULPion SoC介绍 PULPion SoC整体架构如下图所示, PULPi 阅读详情

相关推荐

SQL Server 内存占用高分析及解决办法(超详细)

如果想让 Sql Server 主动释放 占用并空闲的内存空间,可以设置Sql Server占用内存的上限,就会让Sql server在。如执行存储过程,自定函数时,SQL Server 需要先二进制编译再运行,编译后的结果也会缓存起来,再次调用时就无需再次编译。才会释放一点占用的内存,所以很多时候,我们会发现运行SQL Server的系统内存往往居高不下这些内存一般都。缓存,以便于再次请求此页的数据的时候,直接从内存返回,就无需读取磁盘了,大大提高了速度。最后文章有啥不对,欢迎大佬在评论区指点!

2301_79080944的博客 3952

Java快速排序原理浅析

快速排序是我们之前学习的冒泡排序的升级,他们都属于交换类排序,都是采用不断的比较和移动来实现排序的。快速排序是一种非常高效的排序算法,它的实现,增大了记录的比较和移动的距离,将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少了总的比较次数和移动次数。同时采用“分而治之”的思想,把大的拆分为小的,小的拆分为更小的,其原理如下:对于给定的一组记录,选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元

weixin_43555489的博客 1091

攻克TypeError: Cannot read properties of undefined (reading ‘NormalModule‘)的四种实战策略

本文详细解析了`TypeError: Cannot read properties of undefined (reading 'NormalModule')`错误的四种实战解决策略。从版本一致性检查、包管理器优化到依赖替换和构建环境配置,帮助开发者快速定位和解决Webpack构建过程中的常见问题,提升开发效率。

weixin_42523670的博客 242

java快速排序详解

快速排序详解

m0_57180439的博客 2304

从DeepMimic到虚拟偶像:用动作捕捉数据训练AI跳舞的完整流程(附Blender插件配置)

本文详细介绍了如何利用DeepMimic的深度强化学习框架,将动作捕捉数据转化为虚拟偶像或游戏角色的舞蹈动作。从核心的模仿学习理念、PyBullet环境搭建、策略网络与奖励函数设计,到数据处理、训练技巧(如参考状态初始化),最后讲解了如何将训练好的AI模型集成到Blender和Unity等工具中,实现从数据到实时驱动角色的完整流程。

weixin_29054399的博客 501

mmpretrain学习笔记

(4)数据集路径 data_root=‘data/imagenet’–》data_root=‘data/Fruits Dataset/images’(7)适当的修改num_workers、epochs、batch_size、lr等。3、训练优化 :梯度下降算法、学习率参数、训练总轮次、学习率变化策略等。my_resnet18_8xb32_in1k.py 完整的配置文件。(6)split=‘train’、split='val’注释掉。2、数据:数据集划分、数据文件路径、批大小、数据增强策略等。

吃葡萄不吐葡萄皮 936

Java 快速排序

快速排序是一种常用的基于比较的排序算法,其时间复杂度为 O(nlogn),并且具有稳定性和广泛的应用场景。本文将全面详细的讲解一下 Java 中快速排序算法的原理、实现以及时间复杂度等问题。

兴趣是最好的老师,勤能补拙 1万+

CiteSpace基础操作(CNKI数据的导入分析)(一)

1 Cite Space简单介绍 2 文献导入 2.1 打开知网,选择高级检索

m0_50990607的博客 5万+

java 快速排序,原理、算法分析、实现细节、优缺点以及一些实际应用场景

java 快速排序,原理、算法分析、实现细节、优缺点以及一些实际应用场景

专注分享技术、实用优质教程、资源 1498

ESP32-IDF开发实例-外部Flash与FatFs文件系统数据存取

FatFs是用于小型嵌入式系统的通用FAT / exFAT文件系统模块。FatFs模块是按照ANSI C(C89)编写的,并且与磁盘I/O层完全分开。因此,它独立于平台。它可以并入资源有限的小型微控制器中,例如8051,PIC,AVR,ARM,Z80,RX等。ESP32-IDF对FatFs提供了良好的支持。

视觉与物联智能 2915

【49】软考软件设计师——冲刺复盘:高频易错点与应试策略|复盘清单+应试技巧

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第49篇,属于**模块六:冲刺与模拟**终篇,聚焦考前最后阶段的“精准复盘+应试提分”。全文围绕“高频易错点清零、答题时间优化、应急处理落地”三大核心,梳理9大知识领域的典型易错点(附避坑技巧)、优化版答题时间分配(含取舍策略)、考中全场景应急方案,配套可直接使用的“复盘清单”和“应试技巧手册”,帮助考生在最后阶段查漏补缺、固化得分逻辑,避免因低级错误丢分,以“稳、准、快”的状态应对考试。下一篇第50篇(终章)将进行全专栏知识体系回顾、考试策略总结

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 439

【Java】快速排序

本文介绍了快速排序的原理优点,以及如何选取基准元素,交换元素的方法等。

zcxyywd的博客 2万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

快速排序算法原理及Java代码实现

快速排序算法原理及Java代码实现1 基本思想1.1 意义1.2 简单解释1.3 基本思想1.4 图示2 Java代码实现快速排序 1 基本思想 1.1 意义 快速排序是冒泡排序的改进版,也是最好的一种内排序,还涉及到分治和递归 1.2 简单解释 冒泡排序中记录的比较和交换是在相邻的单元中进行,每次交换只能上移或下移一个单元,因而总的比较和移动次数较多 1.3 基本思想 ①先从数列中取出一个数作为...

Yuqbd的博客 1413

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

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

快速排序原理以及java实现

原理:选择一个关键值作为基准值。比基准值小的都在左边序列(无序的),比基准值大的都在右边(无序的)。一般选择序列的第一个元素。 一次循环:从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果没有继续比较下一个,直到找到第一个比基准值小的值才交换。找到这个值之后,又从前往后开始比较,如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的值才交换。直到从前...

音速小子 3480

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

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

快速排序的原理及JAVA实现

一.基本原理: 从待排数据序列中任取一个元素作为分界值(比如第一个),将所有比它大的放在右边,将所有比它小的放在左边,这样一次下来就得到了两个子序列,左边序列的数据元素的值都比临界值小,右边序列元素的值都比临界值大。将子序列也进行快速排序,如果排序还未完成,继续分成子序列进行快速排序,直到所有数据元素全部排序完成。 ...

m0_62032123的博客 812

快速排序原理及Java实现

漫画:什么是快速排序?(完整版) 快速排序-填坑法 视频:快速排序算法–填坑法 快速排序算法思路(双指针) 快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 快速排序示意图,以11为基准,把数组分成大于11和小于11的两部分,分别进行排序 现在有5个数,取中间数为基准值,此时中间数是0 可以

想握住此生辽阔 254

快速排序原理及JAVA实现

快速排序quick sort原理,细节,java实现

weixin_44616879的博客 304

快速排序 java_实例 | Java 实现快速排序算法,有算法原理和代码哦!

↑ 点击上面 “时代Java”关注我们,关注新技术,学习新知识!快速排序算法是常用的排序算法之一,其原理也很简单。1、算法原理分别从初始序列“6 1 2 7 9 3 4 5 10 8”两端开始“探测”。先从右往左找一个小于6的数,再从左往右找一个大于6的数,然后交换他们。这里可以用两个变量i和j,分别指向序列最左边和最右边。我们为这两个变量起个好听的名字“哨兵i”和“哨兵...

weixin_39550379的博客 693

03Java常用API-9. 快速排序原理以及代码实现

03Java常用API-9. 快速排序原理以及代码实现*

学无止境 623

《Java 实现快速排序:原理剖析与代码详解》

排序算法在数据处理和计算机编程领域中占据着举足轻重的地位,它们能够将无序的数据按照特定的规则整理成有序的序列,方便后续的分析与操作。在我们给出的代码中,选取的是数组的第一个元素作为基准值。在完成一次划分操作后,基准值就处于它在排序后应该所处的大致位置(即左边的元素都比它小,右边的元素都比它大)。将数组划分为两部分,使得左边部分的所有元素都小于等于基准值,右边部分的所有元素都大于等于基准值。来交换它们所指向的元素,使得数组的左边部分逐渐出现小于等于基准值的元素,右边部分逐渐出现大于等于基准值的元素。

qq_69304031的博客 1065

排序:Java实现快速排序原理及代码注释详解

快速排序 1.简介: 快速排序是对冒泡排序的一种改进。它的最坏时间复杂度为O(n2),最好时间复杂度为O(nlogn),平均时间复杂度为O(nlogn),它是不稳定排序。 基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 2.算法原理:...

鄙人kunzhi96,感恩遇见! 858

java快速排序_快速排序的原理及java代码实现

概述快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(nlogn)次比较。事实上,快速排序通常明显比其他Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,并且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性。快速排序,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均...

weixin_42415059的博客 244

java实现快速排序以及快速排序的原理

java的快速排序,快排实现

qq_41365496的博客 2487

快速排序(QuickSort)原理及Java 实现

快速排序(QuickSort )是常用到的效率比较高的一种排序算法,在面试过程中也经常提及。下面就详细讲解一下他的原理、给出一个Java版本的实现。 快速排序思想: 通过对数据元素集合Rn 进行一趟排序划分出独立的两个部分。其中一个部分的关键字比另一部分的关键字小。然后再分别对两个部分的关键字进行一趟排序,直到独立的元素只有一个,此时整个元素集合有序。 快速排序的过程——挖坑

sun_star1chen的专栏 1万+

【双路快速排序算法】详解:原理、图示与Java实现

双路快速排序是快速排序的改进版本,由C. A. R. Hoare提出,主要用于解决**含有大量重复元素**数组的排序问题。相比传统快速排序,它能更均衡地分配重复元素,避免分区不平衡导致的性能下降。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 7211
上一篇: 二叉搜索树Java实现(查找、插入、删除、遍历)
下一篇: 深入理解Java对象序列化
还不够
博客等级 码龄16年 113粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值