【算法】快速排序算法原理及实现

news2024/12/23 15:35:43

1.什么是快速排序算法

快速排序是对冒泡排序的一种改良版,通过一趟排序,把要排序的序列分割成两个部分,一部分的所有数据要比另一部分的数据都小,然后再根据这两部分的数据来进行快速排序。以此来达到整一个数据都变成了有序序列。

(1)快速排序基本思路

  • 首先快速排序要选取一个基准值,以基准值为分割,把比该基准值小的放左边,基准值大的放右边。然后得出来的序列再进行快速排序。

(2)快速排序的应用场景

  • 快速排序的时间复杂度为O(nlogn),是目前基于比较的内部排序里被认为是最好的方法,当数据过大并且数据是杂乱无序的时候,适合用快速排序。

(3)快速排序的优缺点

  • 优点:平均性能好O(nlogn)
  • 缺点:不稳定,如果初始的序列或基本的序列是有序的时候,时间复杂度为O(n²)。

2.快速排序算法图解

  • 第一趟排序:以初始数据的头元素作为基准值来进行分割,把比25小的作为一部分,比25大的又作为一部分。
  • 第二趟排序:比25小的那一部分以开头的15作为基准值来拆分成两部分,比15小的为一部分(8,12,4,10),比15大的为一部分(20)。此外另一组是比25大的,以46为基准值,比46小为一部分,比46大为一部分。
  • 第三趟排序:比15小的以开头的8作为基准值又开始进行分组,分为比8小和比8大这两部分。
  • 最后合并出来的数据就是已经排序好了的

在这里插入图片描述在这里插入图片描述

  • 拆分原理讲解
    • 1.先是right从右往左找,寻找比基准值小的数,找到了10。接着left指针开始从左往右找,寻找比基准值大的数,找到了31,这时10与31进行互换。
    • 2.然后right继续从右往左找,找到了4。然后left开始从左往右找,找到了46,这时4与46的位置进行交换。
    • 3.这时right继续从右往左找,找到了15。left也开始从左往右找,它也到了15的位置。说明整个数据已经遍历过一次了。然后就是基准值跟两个指针重合的位置进行交换。
  • 基准值的选取
    • 固定位置选取基准值:选取第一个或者是最后一个元素作为基准值
    • 随机选取基准值:选取待排序里的任意一个数作为基准值
    • 三数取中法:取第一个数与中间数和最后一个数来比较,哪一个在中间那就以谁作为基准值。如:‘10’,‘44’,‘2’,这三个数10在中间,取10。

在这里插入图片描述在这里插入图片描述

3.快速排序算法编码实现

(1)整体代码实现

public class QuickSort {
    public static void main(String[] args) {
        int[] arr = {25,12,20,31,8,46,15,4,50,10};
        System.out.println("排序前:");
        System.out.println(Arrays.toString(arr));
        quickSort(arr,0,9);
        System.out.println("排序后:");
        System.out.println(Arrays.toString(arr));
    }

    public static void quickSort(int[] arr,int leftIndex,int rightIndex){
        //递归 如果左边的索引大于右边的索引,跳出循环,递归结束
        if(leftIndex>rightIndex){
            return;
        }
        int left = leftIndex;
        int right = rightIndex;
        //定义基准值
        int key = arr[left];
        //扫描左边跟右边的数字,只有当left<right的时候才会循环
        while(left<right){
            //右边 找到一个最小的基准值,从右指针向前开始找
            while (right>left && arr[right]>=key){
                right--;
            }
            //找到之后,交换值
            arr[left] = arr[right];

            //左边 找到大于基准值的数字,从左指针向后开始找
            while(left<right && arr[left]<=key){
                left++;
            }
            //找到之后,交换值
            arr[right]=arr[left];
            //执行到这步,left=right,基准值归位
            arr[left]=key;
            //递归调用,对基准值左边的元素进行排序
            quickSort(arr,leftIndex,left-1);
            //递归调用,对基准值右边的元素进行排序
            quickSort(arr,right+1,rightIndex);
        }
    }
}

(2)运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/189355.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI算法创新赛-人车目标检测竞赛总结01

AI0000020摘要:人车目标检测竞赛主要考察目标检测算法与 TPU 部署推理&#xff0c;主要考察算法选型与调 优&#xff0c;面向算能 TPU 迁移部署与推理加速两项能力;主要考核目标是算法效果(mAP)与推 理性能(单张图片推理时间)。针对这些要求&#xff0c;笔者从算法选型&#xf…

【实际开发11】- 统计 / 科学计算 - 1

目录 1. sql 统计返回值为 null 时 , 赋值 为 : 0 ( return UI ) 1. 手动 null 判断 , 进行 “0” 赋值 2. XxxxVO 展示对象 , 初始化时 , 赋值默认值 ( 待优化 ) 2. 统计异常 1. 注意中间表数据的维护 ( 同步删除 / 避免手动删数据 ) 3. 精度损失 1. Java 类型 float、…

.NET(C#、VB)APP开发——Smobiler平台控件介绍:LiveStream和LiveStreamPlayer

本文简述如何在Smobiler中使用LiveStream和LiveStreamPlayer。 LiveStream 直播推送插件 Step 1. 新建一个SmobilerForm窗体&#xff0c;并在窗体中加入LiveStream和Button&#xff0c;布局如下 选中LisvStream&#xff0c;在设计器中设置Url&#xff08;需要事先准备一个视频…

【面试原型链】前端面试那些事(1)之原型链详解

【写在前面】辞旧迎新的春季佳节&#xff0c;在这里博主先祝各位看官新的一年赚钱多多&#xff0c;知识满满&#xff0c;年后谈到面试&#xff0c; 好多人在面试的时候就倒在原型链知识点上面&#xff0c;主要原因还是基本功不够扎实&#xff0c;针对以前的知识我也计划在2023年…

C语言小题,通过指向结构体变量的指针变量输出结构体变量中成员的信息。(指针结构体变量的指针)

前言&#xff1a; 此篇是针对 指针结构体变量的指针 方面的练习。 解题思路&#xff1a; 在已有的基础上&#xff0c;本题要解决两个问题&#xff1a; &#xff08;1&#xff09;怎样对结构体变量成员赋值&#xff1b; &#xff08;2&#xff09;怎样通过指向结构体变量的指针…

天云数据:Hubble数据库系统自主研发率99.62%,是真正的信创数据库

软件是新一代信息技术的灵魂&#xff0c;是数字经济发展的基础&#xff0c;是制造强国、网络强国、数字中国建设的关键支撑。2021年&#xff0c;工信部印发的《“十四五”软件和信息技术服务业发展规划》明确指出&#xff0c;要聚力攻坚基础软件&#xff0c;关键基础软件补短板…

Javascript基础复盘5

内置对象 值属性 这些全局属性返回一个简单值&#xff0c;这些值没有自己的属性和方法。 InfinityNaNundefinedglobalThis函数属性 全局函数可以直接调用&#xff0c;不需要在调用时指定所属对象&#xff0c;执行结束后会将结果直接返回给调用者。 eval()uneval()isFinite()isN…

Q-Learning以及.NET环境下的实现

Q-Learning以及.NET环境下的实现写在前面机器学习Q-Learning环境准备试题准备解题过程写在结尾写在前面 看过我的文章的朋友应该都知道&#xff0c;我之前一直在研究视觉相关的知识&#xff0c;也看了一些卷积神经网络&#xff08;CNN&#xff09;&#xff0c;深度学习相关的文…

强化学习之:价值学习Value-Based Learning

文章目录参考内容动作价值函数&#xff08;Action-value Function&#xff09;深度强化学习&#xff08;DQN&#xff09;学习目标&#xff08;Goal&#xff09;如何获得尽可能好的 Q∗(st,a)→Q^{*}(s_t, a) \rightarrowQ∗(st​,a)→ 用神经网络通过学习获得时间差分算法&…

cocos creater 3.x 开发笔记(踩坑总结)

1、cocos creater 3.x 花屏闪屏黑屏 1.1 花屏 排序是一个很简单的功能&#xff0c;但是最终的呈现却是根据不同平台提供的渲染能力来的。因此&#xff0c;在这里说明一下&#xff0c;如果遇到了 UI 渲染出错&#xff0c;花屏&#xff0c;闪屏等现象&#xff0c;首先要检查的就…

【安装合集】Mysql8.0安装 2023年1月31日 22点15分

1.鼠标右击【Mysql8.0】压缩包选择【解压到Mysql8.0】。 2. 鼠标右击【mysql-installer-community-8.0.17.0】选择【安装】 3. 勾选【I accept the license terms】然后点击【Next】。 4. 选择【Custom】然后点击【Next】。 5. 双击【MySQL Servers】 双击【MySQL Server】&am…

数据指标体系的建设思考(四)

这一篇主要介绍对数据指标体系的价值、数据指标管理平台的理解及数据分析的趋势解读。 一、数据指标体系价值 关于数据指标体系的价值&#xff0c;我想大多数从事数据工作的人员都可以感受得到&#xff0c;毕竟数据指标的输出可以通过可视化的方式&#xff08;如大屏、驾驶舱…

Linux 中去除 vi/vim 和 git diff 中的 ^M 问题解决办法

去除 vi/vim 和 git diff 中的 ^M 问题解决办法问题现象初步分析进一步查看问题解决Source Insightdos2unixNodpadVimsed 命令综上Reference问题现象 git diff 时发现下面的情况&#xff0c;新修改的代码之处都是携带 ^M 字符&#xff0c; 初步分析 肯定是因为 Windows 和 …

推荐5款常用的有限元分析CAE软件

正如我们之前谈到的&#xff0c;计算机辅助软件有助于进行有限元分析。但是我们如何识别好的 CAE 软件呢&#xff1f;CAE 软件必须满足以下要求才能被纳入其类别使用户能够通过图形用户界面 (GUI) 创建模拟允许在模拟中测试组件&#xff0c;同时具有可自定义的环境变量协助优化…

JAVA队列-接口

前言 说到队列,大家都不陌生,很多场景都需要使用到队列,今天我们一起学习JDK提供的队列源码 类图 Queue接口的实现类有很多 从中,我们看到几个熟悉的,BlockingQueue 阻塞队列、Deque 双端队列 Queue 官方介绍: A collection designed for holding elements prior to proce…

MORPHVOX PRO 变声器 软件 Crack

MORPHVOX PRO 变声器 变音的全新层次 在网上聊天和游戏中使你变音 它具有超高语音学习技术&#xff0c;背景取消和高音质特点&#xff0c;将变音带向全新层次。 上好的变音质量 聆听MorphVOX Pro上好的变音质量。 *变音的音频因人而异&#xff0c;但它确实是同一个说话者发出…

国内爬虫图鉴

文章目录爬虫图鉴1.三个问题2.互联网上的爬虫2.1豪哥与爬虫2.2爬虫简介2.3APP身边的爬虫2.4爬虫排名1、排名第一的是出行2、排名第二的是社交。3、排名第三的是电商。4、接下来是 O2O 和搜索引擎。5、最后再说说政府部门。3.关于爬虫的几点疑问4.爬虫的TopN爬虫图鉴 本文案例来…

【数学建模】层次分析法(AHP)-Python实现

1 前言 本文主要讲解层次分析法&#xff08;AHP&#xff09;的python实现&#xff0c;后续会跟进实例分析 2 代码实现 导入包 import numpy as np2.1 构造判断矩阵 判断矩阵一般采用专家意见法&#xff0c;也就是德尔菲法。但是比赛的时候也没有什么专家&#xff0c;大家自…

2019-arXiv-Edge Contraction Pooling for Graph Neural

2019-arXiv-Edge Contraction Pooling for Graph Neural Paper: https://arxiv.org/abs/1905.10990 Code: https://github.com/pyg-team/pytorch_geometric/tree/master/benchmark/kernel 图神经网络的边缘收缩池化 池化层可以使GNN对抽象的节点组而不是单个节点进行推理。为…