【归并排序/快排/堆排序】912. 排序数组

news2024/9/23 19:17:50

力扣连接:. - 力扣(LeetCode)

归并排序

对左右子集合分别排序,然后合并两个有序数组

class Solution {
    int[] nums;
    public int[] sortArray(int[] nums) {
        this.nums = nums;
        return sort(0, nums.length-1);
    }

    int[] sort(int st, int ed) {
        if(st == ed) {
            return new int[]{nums[st]};
        }
        //对左右分别排序
        int m = st + (ed-st)/2;
        int[] leftArr = sort(st, m);
        int[] rightArr = sort(m+1, ed);

        //合并两个有序数组
        int[] newArr = new int[ed-st+1];
        int i=0,j=0,k=0;
        while(i<leftArr.length && j<rightArr.length){
            if(leftArr[i]<rightArr[j]){
                newArr[k++]=leftArr[i++];
            }else{
                newArr[k++]=rightArr[j++];
            }
        }
        while(i<leftArr.length) newArr[k++] = leftArr[i++];
        while(j<rightArr.length) newArr[k++] = rightArr[j++];

        return newArr;
    }
}

快排

每次任意指定一个数作为标杆,小于标杆的放左边,大于标杆的放右边,对左右子数组重复这个流程

时间复杂度:O(n log n)

空间复杂度:O(n)

class Solution {
    int[] nums;

    public int[] sortArray(int[] nums) {
        this.nums = nums;
        sort(0, nums.length - 1);
        return nums;
    }

    void sort(int st, int ed) {
        if (st >= ed)
            return;
        int p = st, l = st, r = ed;
        while (l < r) {
            // r指向第一个小于等于nums[p]的,注意这和下个while顺序不能随便换,要保证l和r最后指向小于等于nums[p]的地方
            while (l < r && nums[r] > nums[p])    r--;
            // l指向第一个大于nums[p]的
            while (l < r && nums[l] <= nums[p])    l++;
            swap(l, r);
        }
        swap(p, l);
        sort(st, l - 1);
        sort(l + 1, ed);
    }

    void swap(int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

}

堆排序

时间复杂度:O(nlogn)

视频讲解:排序算法:堆排序【图解+代码】_哔哩哔哩_bilibili

大顶堆:父节点比两个子节点都要大

下标规律:

节点 i 的父节点:(i-1)/2

节点 i 的左子节点:i*2+1

节点i的右子节点:(i+1)*2

维护大顶堆:从下往上,第一个有孩子节点的节点开始,取根节点、左孩子、右孩子之间的最大值 换到根节点处

排序:堆顶的元素一定是最大的,每次将堆顶元素放到尾部,然后剩下元素再次维护大顶堆,重复

class Solution {
    int[] nums;
    public int[] sortArray(int[] nums) {
        this.nums = nums;
        int len = nums.length;
        sort(len);
        return nums;
    }

    void sort(int len) {
        //建堆
        for(int i= len/2-1;i>=0;i--) {
            heapify(len, i);
        }
        //排序
        for(int i=len-1;i>0;i--) {
            swap(i, 0);
            //i以后的数是已经排序好的
            heapify(i, 0);
        }

    }

    //i: 待维护的节点下标
    //len: 参与维护大顶堆的数组长度
    void heapify(int len, int i) {
        int biggest = i;
        int left = i*2+1;
        int right = (i+1)*2;
        //len用来约束递归终止条件
        if(left<len && nums[biggest]<nums[left]){
            biggest = left;
        } 
        if(right<len && nums[biggest]<nums[right]){
            biggest = right;
        }
        if(biggest != i){
            swap(biggest, i);
            heapify(len, biggest);
        }
    }

    void swap(int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

}

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

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

相关文章

电机学前置知识

https://zhuanlan.zhihu.com/p/712393024 基本定律 全电流定律&#xff08;安培环路定律&#xff09; 在磁场中沿任意闭合回路磁场强度的线积分等于穿过该回路所有电流的代数和&#xff0c;即&#xff1a; ∮ H ⋅ d l ∮ J ⋅ d s \oint H \cdot dl \oint J \cdot ds ∮H…

Windows 11下RTX 4090深度学习及大模型微调环境安装指南

在安装深度学习及大模型微调环境时&#xff0c;经历了多次反复操作&#xff08;如CUDA、cuDNN、PyTorch的安装与卸载&#xff09;。为了避免走弯路&#xff0c;总结了以下步骤&#xff1a; 步骤 1&#xff1a;显卡驱动安装 首先在安装完Windows 11后&#xff0c;安装RTX 4090显…

C++——类模板经典案例——自定义通用数组类

案例&#xff1a;自定义数组类 需求&#xff1a; 1&#xff0c;对内置数据及自定义数据类型的数据存储 2&#xff0c;将数组中的数据存储到堆区 3&#xff0c;构造函数中可以存入数组的容量 4&#xff0c;提供对应的拷贝构造函数和运算符重载防止浅拷贝问题的发生 5&#xff0c…

户外上网黑科技|300~500元随身wifi测评推荐,华为vs格行vs中兴vs上赞,哪个好?

1.老牌国货&#xff0c;颜值担当——华为 设备价格&#xff1a;499元 套餐价格&#xff1a;99一个月 599一年 质保时间&#xff1a;1年 测评&#xff1a;网速大概在50~60M/S&#xff0c;华为是老牌国货了&#xff0c;设备上没有硬伤&#xff0c;家里连接多设备都没什么问…

小怡分享之Java中的异常

前言&#xff1a; &#x1f308;✨之前小怡带大家认识了String类&#xff0c;今天小怡给大家分享Java中的异常。 1.异常的概念与体系结构 1.1 异常的概念 在日常开发中&#xff0c;绞尽脑汁将代码写的尽善尽美&#xff0c;在程序运行中&#xff0c;难免会出现一些奇奇怪怪…

Python学习(2):在单机机器学习,使用Dask实现鸢尾数据集 Iris 的分类任务

目录 一、源码来源 二、鸢尾花数据集的品种分类 1、数据处理步骤 &#xff08;1&#xff09;数据集加载 &#xff08;2&#xff09;准备特征和标签 &#xff08;3&#xff09;训练集和测试集划分 2、安装必需的软件包 3、运行程序 三、信用卡欺诈数据集检测信用卡交易…

全网最详细的LVS实战详解

一、Lvs-nat实战部署 1、准备 设置好网卡信息 2、基础环境搭建详情 ①调度器LVS:网卡ens160(NAT模式)、网卡ens224(仅主机模式)&#xff0c;使其可处于不同的VLAN段 为网卡ens160设置IP vmset.sh ens160 172.25.254.100 lvs.zf.org为网卡ens224设置IP vmset.sh ens224 192.…

在MAC安装Lazarus 起点 - 我们的第一个Lazarus程序!

安装Lazarus 首先到Lazarus官网&#xff0c;找到合适的版本下载页面&#xff0c;比如Mac的版本&#xff1a; https://sourceforge.net/projects/lazarus/files/Lazarus%20macOS%20x86-64/Lazarus%203.4/ 将三个文件都下载到本地&#xff0c;需要安装这三个文件&#xff1a; …

Python学习(1):使用Python的Dask库实现并行计算

目录 一、Dask介绍 二、使用说明 安装 三、测试 1、单个文件中实现功能 2、运行多个可执行文件 最近在写并行计算相关部分&#xff0c;用到了python的Dask库。 Dask官网&#xff1a;Dask | Scale the Python tools you love 一、Dask介绍 Dask是一个灵活的并行和分布式…

C语言 ——— 学习并使用字符分类函数

目录 学习isupper函数 学习isdigit函数 学习tolower函数 将输入的字符串中把大写字母转换为小写字母并输出 学习isupper函数 参数部分&#xff1a; 形参需要传递的是一个字母&#xff0c;字符在ASCII码表上是以整型存储的&#xff0c;所以实参部分用(int c)没有问题 返回…

HarmonyOS笔记3:从网络数据接口API获取数据

面向HarmonyOS的移动应用一般采用MVVM模式&#xff08;见参考文献【1】&#xff09;&#xff0c;其中&#xff1a; M&#xff08;Model层)&#xff1a;模型层&#xff0c;存储数据和相关逻辑的模型。它表示组件或其他相关业务逻辑之间传输的数据。Model是对原始数据的进一步处理…

享界S9别乱选,定价有大玄机!

文 | AUTO芯球 作者 | 雷慢 享界S9刚上市&#xff0c; 就有人傻钱多、工作忙的老大哥来问我&#xff0c; 两个版本怎么选&#xff1f; 这不巧了吗&#xff0c;论华为车系&#xff0c;我是资深用户&#xff0c; 常开问界M9&#xff0c;试过智界S7&#xff0c;问界M7&#x…

PUA自己到无法自拔,或许是你过度信奉【优绩主义】

本文算是人文社科心理篇的第二期&#xff0c;不时发一些【理性】的【鸡汤】&#xff0c;或许对你认识社会本质有所帮助~ 一.定义 顾名思义&#xff0c;从理科生的角度来说&#xff0c;【优绩主义】以优秀的成绩作为评判人生是否成功的极大型指标&#xff0c;在东亚的【休息羞…

性能优化之自定义指令实现图片懒加载

1&#xff09;图片懒加载 是常见的用于在页面滚动时动态加载图片&#xff0c;而不是在页面加载时一次性加载所有图片。性能优化必备提高页面加载速度的手段&#xff0c;特别是在包含大量图片的网站上。 图片懒加载的原理&#xff0c;其实就是&#xff0c;当图片出现在视口内时…

数据分析:宏基因组的荟萃分析之MMUPHin

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 介绍 批次效应是实验中由于样本处理和测序技术变异引起的非生物学差异&#xff0c;可能干扰研究结果。这种效应难以完全消除&#xff0c;但可通过方法如PCA、PC…

【Vue3】Pinia getters

【Vue3】Pinia getters 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。本…

求职leetcode题目(6)

1.简化路径 解题思路: 根据题意&#xff0c;使用栈进行模拟即可。 具体的&#xff0c;从前往后处理 path&#xff0c;每次以 item 为单位进行处理&#xff08;有效的文件名&#xff09;&#xff0c;根据 item 为何值进行分情况讨论&#xff1a; item 为有效值 &#xff1a;存…

AQS框架

文章目录 概要AQS概述公平锁与非公平锁原理可重入 概要 假设现在需要写一个SDK层面的锁&#xff0c;应该如何实现呢&#xff1f; 初步的思路如下&#xff1a; 搞一个状态标记&#xff0c;用来表示持有或未持有锁&#xff0c;但得是 volatile 类型的保证线程可见性。编写一个 …

揭秘公司高效查快递的秘密武器

在快节奏的现代商务环境中&#xff0c;物流管理的效率直接关系到企业的运营成本和客户满意度。对于拥有大量快递业务往来的公司而言&#xff0c;如何快速、准确地追踪每一个包裹的物流信息&#xff0c;成为了一项至关重要的任务。今天&#xff0c;我们将揭秘一款公司高效查快递…

智慧农场数字港系统设计与实现

1 项目介绍 1.1 摘要 农业是一个国家的根本之一&#xff0c;也是国家经济、社会发展的重中之重&#xff0c;从“粮食第一”方针到农业生产市场化&#xff0c;再到乡村振兴、加强扶持农业技术创新和基础建设&#xff0c;我国的农业发展以及走过了几个阶段&#xff0c;并一直在…