排序算法笔记-快速排序

news2024/11/26 21:37:39

请添加图片描述

文章目录

  • 笔记
    • 简介
    • 时间复杂度
    • 空间复杂度
    • 解题模版
    • 练习题

笔记

简介

快速排序:确定分界数,左边小于分界,右边大于分界数,通过递归来不断重置分界数划分区域,直至完成排序

时间复杂度

最优 n*logn
最差 n^2

空间复杂度

原地排序,所以空间复杂度是 O(1)

解题模版

细节不在阐述,自己理解一下

class Solution {
    public void sortColors(int[] nums) {
        if(nums == null || nums.length <=1)
            return ;
        quicksort(nums,0,nums.length-1);

    }
    private void quicksort(int[] nums,int left,int right){
        if(left>right){
            return;
        }
        int pivot = partition(nums,left,right);
        quicksort(nums,left,pivot-1);
        quicksort(nums,pivot+1,right);
    }
    private int partition(int[] nums,int left,int right){
        int pivot1 = nums[right];
        int i = left-1;
        for(int j = left;j<right;j++){
            if(nums[j]<=pivot1)
                i++;
            swap(nums,i,j);
        }
        swap(nums,i+1,right);
        return i+1;
    }
    private void swap(int[] nums,int i,int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

练习题

力扣912. 排序数组
套用模版,完美解决

class Solution {
    public int[] sortArray(int[] nums) {
        if(nums == null || nums.length <= 1){
            return nums;
        }
        quickSort(nums,0,nums.length-1);
        return nums;
    }
    private void quickSort(int[] nums,int start,int end){
        if(start >= end){
            return;
        }
        int pivot = partition(nums,start,end);
        quickSort(nums,start,pivot-1);
        quickSort(nums,pivot+1,end);
    }
    private int partition(int []nums,int start,int end){
        int pivot = nums[end];
        int i = start -1;
        for(int j =start;j<end;j++){
            if(nums[j]<= pivot){
                i++;
                swap(nums,i,j);
            } 
        }
        swap(nums,i+1,end);
        return i+1;
    }
    private void swap(int[] nums,int i,int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

力扣215 数组中的第K个最大元素
题中要求使用O(n)时间复杂度,因此可以借助快排的分区思想,因为求第K大,并不是全部排序,平均下来时间复杂度满足条件。

class Solution {
    public int findKthLargest(int[] nums, int k) {
        if(nums == null || nums.length == 0 || k<=0 || k>nums.length)
            return -1;
        int targetIndex = nums.length-k;
        int left =0;
        int right = nums.length-1;
        while(true){
            int pivotIndex = partition(nums,left,right);
            if(pivotIndex == targetIndex){
                return nums[pivotIndex];
            }else if(pivotIndex <targetIndex){
                left = pivotIndex +1;
            }else{
                right = pivotIndex-1;
            }
        }
    }
    private int partition(int [] nums,int left,int right){
        int pivot = nums[right];
        int i = left-1;
        for(int j =left;j<right;j++){
            if(nums[j]<=pivot){
                i++;
                swap(nums,i,j);
            }
        }
        swap(nums,i+1,right);
        return i+1;
    }
    private void swap(int[] nums,int i,int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j]= temp; 
    }
}

力扣75. 颜色分类

看到题目要求,非常适合使用快排,直接默写

class Solution {
    public void sortColors(int[] nums) {
        if(nums == null || nums.length <=1)
            return ;
        quicksort(nums,0,nums.length-1);
    
    }
    private void quicksort(int[] nums,int left,int right){
        if(left>right){
            return;
        }
        int pivot = partition(nums,left,right);
        quicksort(nums,left,pivot-1);
        quicksort(nums,pivot+1,right);
    }
    private int partition(int[] nums,int left,int right){
        int pivot1 = nums[right];
        int i = left-1;
        for(int j = left;j<right;j++){
            if(nums[j]<=pivot1){
                i++;
                swap(nums,i,j);
            }
        }
        swap(nums,i+1,right);
        return i+1;
    }
    private void swap(int[] nums,int i,int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

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

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

相关文章

找工作不用愁!送你一份Salesforce顾问面试秘籍(下)(含答案)

作为SaaS行业的先驱&#xff0c;Salesforce的发展一路高歌猛进。在Salesforce生态系统中不仅能学习到最新的技术&#xff0c;而且比其他行业的同岗位享有更高的薪水&#xff0c;这也驱使了越来越多人加入Salesforce大军。 在之前的文章中&#xff0c;自由侠部落为学习者梳理了…

Qt6之QSetting读取为空或失败

一、目的 QSetting终极目的是&#xff0c;模糊平台&#xff0c;一套方法可以同时写入或者读取配置文件及注册表。 二、问题 QSetting确实兼顾了平台&#xff0c;linux、mac、windows三大平台均能使用&#xff0c;但就像所有事物一样&#xff0c;大一统的背后必定要做出一些让步…

STM32 Proteus仿真水箱水塔水位温度控制系统DS18B20 -0065

STM32 Proteus仿真水箱水塔水位温度控制系统DS18B20 -0065 Proteus仿真小实验&#xff1a; STM32 Proteus仿真水箱水塔水位温度控制系统DS18B20 -0065 功能&#xff1a; 硬件组成&#xff1a;STM32F103C8单片机 LCD1602显示器ADC220V转3.3V电路DS18B20温度多个按键&#xf…

刚刚出炉,速看7月编程语言排行榜

2023年已经过半&#xff0c;最新一期的编程语言排行榜你看了吗&#xff1f;刚刚&#xff0c;全球知名编程语言社区TIOBE公布了7月榜单&#xff0c; TIOBE 7 月 TOP 15 编程语言&#xff1a; 详细榜单可参考官网&#xff1a; https://www.tiobe.com/tiobe-index/ 在众多编程语…

openpnp - 伺服JAWD7502的参数读取

文章目录 openpnp - 伺服JAWD7502的参数读取概述笔记备注END openpnp - 伺服JAWD7502的参数读取 概述 设备用的双Y轴用到了伺服JAWD7502, 准备将参数读出来, 以备不时之需. 笔记 JAWD7502直接提供了USB接口, 连到电脑就行. 不用准备特别的通讯线. USB接口类型是MicroUSB U…

智能优化算法——哈里鹰算法(Matlab实现)

目录 1 算法简介 2 算法数学模型 2.1.全局探索阶段 2.2 过渡阶段 2.3.局部开采阶段 3 求解步骤与程序框图 3.1 步骤 3.2 程序框图 4 matlab代码及结果 4.1 代码 4.2 结果 1 算法简介 哈里斯鹰算法(Harris Hawks Optimization&#xff0c;HHO)&#xff0c;是由Ali Asghar Heid…

IME SoftInputWindow窗口添加

IME SoftInputWindow窗口添加 1、时序图2、InputMethodService#onCreate()3、Dialog添加到WMS android12-release1 1、时序图 输入法应用继承InputMethodServiceframeworks/base/core/java/android/view/inputmethod/InputMethodManager.java frameworks/base/core/java/andro…

【JAVA】数据类型,类型转换与提升,运算符,标识符命名规则

&#x1f349;内容专栏&#xff1a;【JAVA】 &#x1f349;本文脉络&#xff1a;数据类型&#xff0c;类型转换与提升&#xff0c;运算符&#xff0c;标识符命名规则 &#x1f349;本文作者&#xff1a;Melon_西西 &#x1f349;发布时间 &#xff1a;2023.7.12 目录 1. 字面常…

【数据结构】数据结构的基本概念

文章目录 思维导图数据结构的基本概念和术语数据结构三要素逻辑结构存储结构数据的运算 重要知识总结 思维导图 数据结构的基本概念和术语 数据&#xff1a;数据是信息的载体。是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据…

【计算机视觉 | 目标检测 | 图像分割】arxiv 计算机视觉关于目标检测和图像分割的学术速递(7 月 12 日论文合集)

文章目录 一、检测相关(7篇)1.1 3D detection of roof sections from a single satellite image and application to LOD2-building reconstruction1.2 Towards exploring adversarial learning for anomaly detection in complex driving scenes1.3 Unveiling the invisible: …

探索嵌入式系统:初学者必知的核心概念解析

探索嵌入式系统&#xff1a;初学者必知的核心概念解析 嵌入式系统是指嵌入在其他设备或系统中的特定目的的计算机系统。它们通常用于控制、监测或执行特定任务&#xff0c;例如汽车的引擎控制单元、智能手机的操作系统或家电中的微控制器。对于初学者来说&#xff0c;以下是一…

Android自动化测试中如何处理各种弹窗

目录 弹窗的种类: APP内的业务弹窗 弹窗处理 watcher的使用 实战案例 总结&#xff1a; 在UI自动化测试中弹窗是影响自动化用例稳定性的一大因素&#xff0c;如何方便快捷的处理各种情况下的弹窗&#xff0c;是搞UI自动化测试必须要面临的问题. 弹窗的种类: 安装APP时的…

MySQL事务 | 隔离级别 | 数据一致性

文章目录 简介一、事务并发问题1. 脏读&#xff08;Dirty Read&#xff09;2. 不可重复读&#xff08;Non-repeatable Read&#xff09;3. 幻读&#xff08;Phantom Read&#xff09;幻读和不可重复读的区别 二、事务隔离级别1. 回顾事务2. 事务级别3. 特点和优缺点 三、事务隔…

科研笔记:一些有用的网站整理(更新中)

1 论文整理网站 整理AI相关领域的一些综述GitHub - KaiyuanGao/AI-Surveys: 整理AI相关领域的一些综述时间序列的paper/code汇总GitHub - qingsongedu/awesome-AI-for-time-series-papers: A professional list of Papers, Tutorials, and Surveys on AI for Time Series in t…

OpenSource - Spring Startup Ananlyzer

文章目录 &#x1f680;Optimization of Spring Startup核心能力&#x1f4c8;Spring应用启动数据采集报告应用启动时长优化 &#x1f4c8;Spring应用启动数据采集报告安装jar包配置项应用启动自定义扩展 &#x1f680;应用启动时长优化支持异步化的Bean类型接入异步Bean优化 开…

idea配置类注解和方法注解最详细教材

1.配置类注释 点击setting 方法一&#xff1a; 1.按照要求添加下图中的模板 /*** Author: aaa* Date: ${YEAR}/${MONTH}/${DAY}* Description: */ 2.勾选下面的两个勾后点击apply 方法二&#xff1a; 我们看到了在刚刚那个模板中有这样一句话 这句话是表示创建项目的时候会…

CASAIM与大疆达成全自动化测量技术合作,CASAIM IS全自动化蓝光测量仪实现无人机叶片全尺寸检测及质量控制

近期&#xff0c;CASAIM与大疆达成全自动化测量技术合作&#xff0c;CASAIM IS全自动化蓝光测量仪实现无人机叶片全尺寸检测及质量控制。 无人机行业在过去几年里取得了迅猛发展&#xff0c;大疆是全球领先的无人飞行器控制系统及无人机解决方案的研发商和生产商&#xff0c;客…

2023年网页设计制作工具盘点

过去&#xff0c;专业人员使用HTMLL、CSS、Javascript等代码手动编写和构建网站。现在有越来越多的智能网页制作工具来帮助任何人实现零代码基础&#xff0c;随意建立和设计网站。在本文中&#xff0c;我们将向您介绍2023年流行的网页制作工具。 1.即时设计 即时设计是一款UI…

​python接口自动化(三十一)--html测试报告通过邮件发出去——下(详解)​

简介  本篇总结了 QQ &#xff08;SSL&#xff09;邮箱和 163&#xff08;非SSL&#xff09; 邮箱发送邮件&#xff0c;专治各种不行&#xff0c;总之看完这篇以后麻麻再也不用担心我的邮件收不到了。以下代码兼容 python2 和 python3&#xff0c;运行无异常&#xff0c;放心大…

Jmeter脚本参数化和正则匹配

目录 一、参数化 1.用户定义的变量 2.CSV数据文件设置 3.用户参数 二、正则提取 1.JSON提取器 2.正则表达式提取器 我们在做接口测试过程中&#xff0c;往往会遇到以下几种情况 每次发送请求&#xff0c;都需要更改参数值为未使用的参数值&#xff0c;比如手机号注册、…