使用 Java 实现快速排序(详解)

2 篇文章 1 订阅
订阅专栏

在这里插入图片描述

一、概述

最近在看一些面试题,发现很多面试过程中都会要求手写快速排序,查阅一些博客发现别人写的并不是特别清楚而且也很难记住,所以为了更好的掌握这个算法,所以在这篇文章中,将自己的学习过程记录下来,你将学习到快速排序算法和使用 Java 如何实现快速排序。

快速排序是一种基于分而治之的排序算法,其中:
1、通过从数组中选择一个中心元素将数组划分成两个子数组,在划分数组时,将比中心元素小的元素放在左子数组,将比中心元素大的元素放在右子数组。
2、左子数组和右子数组也使用相同的方法进行划分,这个过程一直持续到每个子数组都包含一个元素为止。
3、最后,将元素组合在一起以形成排序的数组。

中心元素(pivot element):有的地方翻译为:枢轴元素、基元,基准元素,我这里就叫做中心元素

二、快速排序算法的工作原理

1、选择中心元素

选择不同位置的中心元素,快速排序就有不同的变体,比如可以选择:第一个元素、最后一个元素以及左端、右端和中心位置上的三个元素的中值作为中心元素,在这里,我们将选择数组的最后一个元素作为中心元素。

2、重新排列数组

现在重新排列数组,将比中心元素小的放在左边,比中心元素大的放在右边。

重新排列数组的方法如下:
1、指针固定在中心元素上,将中心元素与从第一个索引开始的元素进行比较。

2、如果该元素大于中心元素,则为该元素设置第二指针。

3、现在将中心元素与其他元素进行比较,如果到达的元素小于中心元素,则将较小的元素和上次找到的较大元素交换位置。

4、同样,重复该过程以将下一个更大的元素设置为第二指针,并且将其和另一个较小的元素交换位置。

5、该过程一直进行到到达倒数第二个元素为止。

6、最后将中心元素与第二个指针指向的元素交换位置。

3、划分子数组

再次分别为左子部分和右子部分选择了中心元素,并且重复步骤2,子数组被分割,直到每个子数组只有一个元素,至此,该数组已经通过快速排序算法升序排好序了。

4、快速排序可视化插图说明

可以借助以下插图了解快速排序算法的工作原理。

三、快速排序算法伪代码

1、伪代码说明

quickSort(array, leftmostIndex, rightmostIndex)
  if (leftmostIndex < rightmostIndex)
    pivotIndex <- partition(array,leftmostIndex, rightmostIndex)
    quickSort(array, leftmostIndex, pivotIndex - 1)
    quickSort(array, pivotIndex, rightmostIndex)

partition(array, leftmostIndex, rightmostIndex)
  set rightmostIndex as pivotIndex
  storeIndex <- leftmostIndex - 1
  for i <- leftmostIndex + 1 to rightmostIndex
  if element[i] < pivotElement
    swap element[i] and element[storeIndex]
    storeIndex++
  swap pivotElement and element[storeIndex+1]
return storeIndex + 1

四、Java 实现快速排序

Java 实现快速排序的代码如下:


public class QuickSort {

    public static int partition(int[] array, int low, int high) {
        // 取最后一个元素作为中心元素
        int pivot = array[high];
        // 定义指向比中心元素大的指针,首先指向第一个元素
        int pointer = low;
        // 遍历数组中的所有元素,将比中心元素大的放在右边,比中心元素小的放在左边
        for (int i = low; i < high; i++) {
            if (array[i] <= pivot) {
                // 将比中心元素小的元素和指针指向的元素交换位置
                // 如果第一个元素比中心元素小,这里就是自己和自己交换位置,指针和索引都向下一位移动
                // 如果元素比中心元素大,索引向下移动,指针指向这个较大的元素,直到找到比中心元素小的元素,并交换位置,指针向下移动
                int temp = array[i];
                array[i] = array[pointer];
                array[pointer] = temp;
                pointer++;
            }
            System.out.println(Arrays.toString(array));
        }
        // 将中心元素和指针指向的元素交换位置
        int temp = array[pointer ];
        array[pointer] = array[high];
        array[high] = temp;
        return pointer;
    }

    public static void quickSort(int[] array, int low, int high) {
        if (low < high) {
            // 获取划分子数组的位置
            int position = partition(array, low, high);
            // 左子数组递归调用
            quickSort(array, low, position -1);
            // 右子数组递归调用
            quickSort(array, position + 1, high);
        }
    }

    public static void main(String[] args) {
        int[] array = {6,72,113,11,23};
        quickSort(array, 0, array.length -1);
        System.out.println("排序后的结果");
        System.out.println(Arrays.toString(array));
    }
}

排序过程的结果如下:

[6, 72, 113, 11, 23]
[6, 72, 113, 11, 23]
[6, 72, 113, 11, 23]
[6, 11, 113, 72, 23]
[6, 11, 23, 72, 113]
[6, 11, 23, 72, 113]
排序后的结果
[6, 11, 23, 72, 113]

从这个排序结果我们可以知道整个排序过程。

五、快速排序的复杂性

时间复杂度O表示
最好O(n * log n)
最差O(n * n)
平均O(n * log n)
空间复杂度O(log n)
稳定性不稳定

1、时间复杂度

  • 最坏的情况复杂度[Big-O] :
    当选择的中心元素是最大或最小的元素时发生,这种情况导致中心元素位于已排序数组的最末端,一个子数组始终为空,而另一个子数组包含元素,因此,仅在此子数组上调用quicksort,快速排序算法对于分散的数据具有更好的性能。
  • 最好的情况复杂度[Big-O] :
    当中心元素始终是中间元素或靠近中间元素时,会发生这种情况。
  • 平均复杂度[Big-O] :
    在不出现上述条件时发生。

2、空间复杂度

快速排序的空间复杂度为O(log n)。

六、快速排序的应用

在以下情况下使用Quicksort算法

  • 编程语言适合递归
  • 时间复杂度很重要
  • 空间复杂性很重要
基础编程:Java快速排序实例详解
09-21
基础编程:Java快速排序实例详解
【排序算法快速排序原理及Java实现
热门推荐
简约人生的博客
04-27 10万+
快速排序是我们之前学习的冒泡排序的升级,他们都属于交换类排序,都是采用不断的比较和移动来实现排序的。快速排序是一种非常高效的排序算法,它的实现,增大了记录的比较和移动的距离,将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少了总的比较次数和移动次数。同时采用“分而治之”的思想,把大的拆分为小的,小的拆分为更小的,其原理如下:
java代码之快速排序算法的三种方式及其优化
奔跑的蜗牛@1997
01-24 5969
快速排序算法的三种方式及其优化java实现1、快速排序算法的简绍2、快速排序的基本思想3、快速排序左右指针法图解4、快速排序左右指针法核心代码5、快速排序挖坑法图解6、快速排序挖坑法核心代码7、快速排序前后指针法图解8、快速排序前后指针法核心代码9、快速排序基准点优化及其核心代码10、快速排序算法的时间复杂度11、快速排序的稳定性11、快速排序与其他排序的比较 1、快速排序算法的简绍 快速排序算法...
Java快速排序
zcxyywd的博客
06-04 1万+
本文介绍了快速排序的原理优点,以及如何选取基准元素,交换元素的方法等。
(九)Java算法快速排序(详细图解)
嘉禾嘉宁papa
11-21 1万+
快速排序
Java 快速排序算法
07-21
Java 快速排序,目前来说效率很高的一种排序算法,好理解。
排序算法快速排序
青鬆下的ミ坚躯 的个人博客
03-04 1万+
高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。 假设我们现在对“6  1  2 7  9  3  4  5 10  8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比...
java实现快速排序算法
a274915611的专栏
09-22 9295
1、算法思想     快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。(1) 分治法的基本思想     分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。(2)快速排序的基本思想     设当前待排序的
快速排序算法java实现
qq_45954420的博客
03-11 1万+
基本思想 快速排序是一种采用分治法解决问题的一个典型应用,也是冒泡排序的一种改进。它的基本思想是,通过一轮排序将待排记录分割成独立的两部分,其中一部分均比另一部分小,则可分别对这两部分继续进行排序,已达到整个序列有序。排序的时间复杂度为 O(nlogn),相比于简单排序算法,运算效率大大提高。 算法步骤 从序列中取出一个数作为中轴数; 将比这个数大的数放到它的右边,小于或等于他的数放到它的左边; 再对左右区间重复第二步,直到各区间只有一个数。 例如,对以下 10..
java算法——快速排序
06-13
快速排序 * 1.i=left,j=right,将基准数挖出形成第一个坑a[i]; * 2.j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]; * 3.i++由前向后找比它大的数,找到后挖出此数填到前一个坑a[j]中 * 4.以i为中线,分左右两个区间,重复2,3,步骤,直到i==j,将基准数填入a[i]中
快速排序算法java实现
11-24
详细解释了快速排序java实现.里面有代码,还有注释说明
详解Java使用泛型实现快速排序算法的方法
09-02
主要介绍了Java使用泛型实现快速排序算法的方法,快速排序的平均时间复杂度为(nlog n),文中的方法立足于基础而并没有考虑优化处理,需要的朋友可以参考下
快速排序的深入详解以及java实现
09-05
本篇文章是对java中的快速排序进行了详细的分析介绍,需要的朋友参考下
Java编程实现快速排序及优化代码详解
08-28
主要介绍了Java编程实现快速排序及优化代码详解,具有一定借鉴价值,需要的朋友可以了解下。
详解Java常用排序算法-快速排序
最新发布
08-26
详解Java常用排序算法-快速排序
快速排序算法
jellcy的专栏
09-12 309
快速排序算法 算法描述:快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。假设要排序的数组是A[1]……A[N
Java快速排序算法
crus的博客
08-24 84
基本思想 快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 算法过程 设要排序的数组是A[0]……A[N-1],首先任意...
java 快速排序详解
05-12
快速排序是一种常用的算法,它采用了分治策略,通过多次比较和交换来实现排序。 在快速排序中,首先需要选取一个元素作为基准值(即pivot),该元素将原数组分为两个子数组,一个子数组中全部元素比pivot小,另一个子数组中元素全部比pivot大。然后按照同样的方式对左右两个子数组进行排序,最终将整个数组排好序。 算法的具体实现可以采用递归或循环。递归实现较为简单,但需要占用大量的栈空间,因此可能导致栈溢出。循环实现虽然代码较为复杂,但能够避免栈溢出问题,并且也能提高算法的效率。 在实际应用中,快速排序具有很高的性能,其时间复杂度为O(nlogn)。但在最坏情况下,即当数组已经有序或者基本有序时,快速排序的时间复杂度将退化为O(n^2)。 因此,在实际应用中,我们通常会通过一系列优化措施来提高算法的效率。例如,针对基准值的选取,通常采用随机化或者三数取中法来避免最坏情况的出现。此外,还可以针对递归实现中栈溢出的问题,采用非递归实现等方法来优化算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • minio的安装及使用 32072
  • 使用 Java 实现快速排序(详解) 23914
  • java计算数据的百分比 22583
  • github 配置使用 personal access token 认证 19618
  • gunicorn 超时报错:[1] [CRITICAL] WORKER TIMEOUT 解决 15069

分类专栏

  • 遇到的问题 7篇
  • kubernetes 10篇
  • 爬虫 3篇
  • 其他 1篇
  • python 5篇
  • go 1篇
  • java 15篇
  • spring boot 5篇
  • 数据结构与算法 2篇
  • docker 12篇
  • devops
  • quarkus 1篇
  • mongodb 1篇
  • 网络相关 1篇
  • maven 2篇
  • jenkins 2篇
  • 大数据 3篇
  • elasticsearch 1篇
  • zookeeper 1篇

最新评论

  • 如何在docker容器中安装一些常用工具

    研究司马懿: CentOS没有yum工具呀

  • k8s 部署 skywalking 并将 pod 应用接入链路追踪

    k_sy: 排版看起来就舒服,应该写的不错,先点赞留言,下次看。

  • docker标准输出日志存储位置,设置docker日志文件大小

    sinat_14977855: 设置完日志大小和个数后,cat hostconfig.json没有任何变化,还是设置之前的个数和大小表情包

  • 使用 Java 实现快速排序(详解)

    陈宁宁Ninging: 博主写的不错,我在你的基础上做了个动画视频,可以学习交流一下:https://www.bilibili.com/video/BV1Uh4y1f7h3

  • spring boot 使用 k8s 的 configMap 作为外部配置

    微凉的风啊: 需要引入 k8s的依赖吗? spring-cloud-starter-kubernetes-config

大家在看

  • 【JUC编程】-多线程和CompletableFuture的使用
  • 代码随想录算法训练营第四十一天 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯 204
  • DAX 底层计算过程演示——ADDCOLUMNS + 复杂上下文环境 149
  • python代码大全和用法,python编程语言大全 454
  • 李飞飞「空间智能」系列新进展,吴佳俊团队新「BVS」套件评估计算机视觉模型 874

最新文章

  • JVM 之字节码(.class)文件
  • 微调Llama2自我认知
  • IDEA “Library source does not match the bytecode for class“问题解决
2023年2篇
2022年3篇
2021年36篇
2020年29篇

目录

目录

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司哈尔滨网站建设多少钱无锡优化推荐徐州营销型网站建设公司衢州网络广告推广报价光明SEO按效果付费推荐景德镇SEO按天收费哪家好汕头网络营销哪家好银川seo优化延安网站改版多少钱松岗网站优化软件价格中卫外贸网站制作推荐铁岭网站定制哪家好孝感网站推广哪家好江门企业网站建设价格新乡百度竞价价格济宁外贸网站建设烟台网站制作报价福州网站优化推广报价观澜建网站公司福永SEO按效果付费多少钱商洛网站推广方案多少钱榆林网站定制报价绍兴网站制作哪家好黄冈阿里店铺运营推荐怀化模板推广报价营口品牌网站设计报价襄阳网站关键词优化公司常州网络广告推广推荐关键词按天计费报价三亚百度竞价包年推广歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化