leetcode 912. Sort an Array(数组排序:quick sort, merge sort, 桶排序)

U8二次开发CO-基于Net8调用COM对象 本文章介绍的U8二次开发CO技术,就是基于微软COM组件技术,使用微软开源的编程框架Net6/7/8/9来调用U8的COM组件,完成基本的登录认证,工作流处理,数据库操作等。 阅读详情

在这里插入图片描述

本题是典型的数组排序,要求时间复杂度在O(nlogn),
借此复习一下quick sort, merge sort和桶排序。

思路:

1.quick sort

quick sort的平均时间复杂度在O(n), 但是最坏的情况是O(n2),
它的主要思想是在数组中选一个pivot,
一般3种选法:选最左边的数字,选最右边的数字,随机数字。
下面的图是选最后一个数字作为pivot.

然后进行操作,目的是让所有比pivot小的数字都在pivot左边,
所有比pivot大的数字都在它的右边。

具体怎么操作呢,看下面的流程:
在这里插入图片描述

假设把比pivot小的数字放在 i 的位置, 刚开始 i 在-1的位置,
j 从左到右遍历,注意我们现在的目的是把比pivot小的数字都换到左边(i 的位置),
所以遇到arr[ j ] > pivot时不需要操作,继续往右走,
当遇到arr[ j ] <= pivot时,把arr[ j ]换到 i 的位置,i每次先往右移一格再换(因为刚开始是-1)。
这样,比pivot小的数字会慢慢地换到比它大的数字左边。
当 j 到达 pivot前面一个数字时,停止,这时i 和 它前面的数字都比pivot小,
i+1 ~ pivot前面一个数字都比pivot大,
现在把pivot换到 i+1的位置,就达到了目的(pivot前面的数字都比它小,后面的数字都比它大)。

这里就不贴这么详细的过程图了,有兴趣的看链接

这个操作数组的过程叫做partition, 算法流程见下图:
在这里插入图片描述
整个quick sort的流程如下
在这里插入图片描述
它是一个分而治之的过程,每次得到pivot的位置,
然后对left ~ pivot, pivot+1 ~ right的部分再quick sort, 直到无法再分为止。
在这里插入图片描述
随机选pivot会比固定选的效果好,平均时间复杂度更易达到O(n),
如果随机选数字,把随机选的数字换到最右边,剩下的步骤和上面一样。

本题选最右边的数字作为pivot出现了TLE, 换成随机选通过,但不是很快。

class Solution {
    Random random = new Random();
    public int[] sortArray(int[] nums) {
        quickSort(nums, 0, nums.length-1);
        return nums;
    }

    void quickSort(int[] nums, int l, int r) {
        if(l < r) {
            int pivot = partition(nums, l, r);
            quickSort(nums, l, pivot-1);
            quickSort(nums, pivot+1, r);
        }
    }

    int partition(int nums[], int l, int r) {     
        int pivot = random.nextInt(r+1-l) + l;  
        
        swap(nums, pivot, r);
        int low = l-1;
        for(int high = l; high < r; high++) {
            if(nums[high] <= nums[r]) {
                low ++;
                swap(nums, low, high);
            }
        }
        swap(nums, low+1, r);
        return (low+1);
    }

    void swap(int[] nums, int low, int high) {
        int tmp = nums[low];
        nums[low] = nums[high];
        nums[high] = tmp;
    }
}

2.merge sort

merge sort的时间复杂度在O(nlogn), 所以适合大规模数字排序的情况,
它常和其他排序算法(比如quick sort)结合起来使用,以提升整体的效率。

它是一个先分再合的过程,如下。
已知数组最左边下标是l, 最右边下标是r, 那么可以计算中间下标mid,
然后拆分成两部分:l ~ mid, mid+1 ~ r
一直到不能再拆分为止。

然后在把两两部分排序合起来,最后形成整个数组。
两两合起来的过程就是两个数组(分别copy出来)的下标都指向0,然后一个一个数字比较,把较小的先存起来(直接存到原数组),然后移动指针,比较下一个,直到两个数组都遍历完。

在这里插入图片描述
算法流程如下:

在这里插入图片描述

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

    void mergeSort(int[] nums, int l, int r) {
        if(l >= r) return;
        int mid = l + (r-l)/2;
        mergeSort(nums, l, mid);
        mergeSort(nums, mid+1, r);
        merge(nums, l, mid, r);
    }

    void merge(int[] nums, int l, int m, int r) {
        int leftLen = m - l + 1;
        int rightLen = r - m;
        int[] leftArr = new int[leftLen];
        int[] rightArr = new int[rightLen]; //mid+1 ~ r

        //把对应的数字copy进去
        for(int i = 0; i < leftLen; i++) leftArr[i] = nums[l+i];
        for(int i = 0; i < rightLen; i++) rightArr[i] = nums[m+1+i];

        int leftIdx = 0;
        int rightIdx = 0;
        int numsIdx = l;

        //sort & merge
        while(leftIdx < leftLen && rightIdx < rightLen) {
            if(leftArr[leftIdx] <= rightArr[rightIdx]) {
                nums[numsIdx] = leftArr[leftIdx];
                leftIdx ++;
            } else {
                nums[numsIdx] = rightArr[rightIdx];
                rightIdx ++;
            }
            numsIdx ++;
        }

        //把剩余的数字copy进去
        while(leftIdx < leftLen) {
            nums[numsIdx] = leftArr[leftIdx];
            leftIdx ++;
            numsIdx ++;
        }
        while(rightIdx < rightLen) {
            nums[numsIdx] = rightArr[rightIdx];
            rightIdx ++;
            numsIdx ++;
        }
    }
}

3.桶排序

桶排序,顾名思义就是每个数字对应一个桶,统计每个桶里面这个数字出现的次数。
然后从小到大把数字摆放进新的数组,每个数字摆放它出现的次数。
这种方法做到了O(n).

可以用hashMap统计每个数字出现的次数,这里直接用数组下标当作key,
但是数字范围太大,太浪费数组的空间,于是可以先找出最小值min 和 最大值 max,
数组的长度只需要max - min + 1即可。

最后不摆放进新的数组,而是直接摆放进原数组。

class Solution {
    public int[] sortArray(int[] nums) {
        int min = nums[0];
        int max = nums[0];
        
        for(int num: nums) {
            min = Math.min(num, min);
            max = Math.max(num, max);
        }
        int len = max - min + 1;
        int[] cnt = new int[len];
        for(int num : nums) {
            cnt[num-min]++;
        }
        
        int idx = 0;
        for(int i = 0; i < len; i++) {
            while(cnt[i] > 0) {
                nums[idx++] = min;
                cnt[i]--;
            }
            min++;
        }
        return nums;
    }
}
地震勘探中的频谱分析:从基础到应用 本文深入探讨了地震勘探中的频谱分析技术,从基础原理到实际应用。通过傅里叶变换等工具,频谱分析能有效识别不同地震波的频率特征,指导数据采集和处理。文章结合油田勘探案例,展示了如何利用振幅谱和相位谱提升信噪比,并介绍了智能滤波等前沿技术在地震数据处理中的应用。 阅读详情

相关推荐

《QMT量化实战系列》支持自定义筛选与排序的多因子策略,实测年化收益超100%

【QMT量化实战系列】推出《支持自定义筛选与排序的多因子策略》,通过Tushare获取38个核心因子数据,实现股票多维筛选(剔除ST股、次新股及特定板块)。策略创新性地采用多因子加权排名机制,通过(股票数-排名+1)/股票数*100的算法计算各因子得分,支持自定义权重组合。该策略提供完整代码及详细注释,涵盖数据获取、因子筛选、权重排序等核心环节,帮助用户构建个性化量化模型。系列内容每月更新1-2期,由浅入深讲解QMT平台实战应用。

qq_46262068的博客 1255

[LeetCode] 912. Sort an Array 数组排序

Given an array of integersnums, sort the array in ascending order. Example 1: Input:[5,2,3,1] Output: [1,2,3,5] Example 2: Input: [5,1,1,2,0,0] Output: [0,0,1,1,2,5] Note: 1 <= A.length &l...

weixin_30699235的博客 245

【FOC无刷电机控制】六步换向、FOC,STM32cubemx从零开始搭建BLDC六步换相代码、FOC代码(基于霍尔传感器)

FOC、六步换相,无刷电机控制

xifan的博客 3万+

LeetCode--快速排序

则把当前节点的数据赋值到 right 节点, 然后停止左边遍历, 开始右边遍历。则把当前节点的数据赋值到 left 节点, 然后停止右边遍历, 开始左边遍历。对左数组递归调用执行 1,2,3 步骤。对右数组递归调用执行 1,2,3 步骤。

安全新司机 1290

YOLOv8有效涨点,增强型 YOLOV8 与多尺度注意力机制特征融合,附代码,详细步骤

在本实验中,我们通过将双层路由注意(BRA)、广义特征金字塔网络(GFPN)和第四检测头结合到YOLOv8中,开发了一种新颖的BGF-YOLO架构。BGF-YOLO 包含注意力机制,可以更多地关注重要特征,特征金字塔网络可以通过将高级语义特征与空间细节合并来丰富特征表示。此外,我们研究了不同的注意力机制和特征融合、检测头架构对检测准确性的影响。实验结果表明,与YOLOv8x相比,BGF-YOLO的mAP50增加了4.7%。

kay_545 3045

[Dify 案例实战] 构建一个基于 Dify 的个人写作助理工具-带绑定资源

想要一个懂你风格、能帮你写文章、润色文字、生成大纲的 AI 写作助手? 本文将带你从 0 到 1,完整实现一个 基于 Dify 工作流的个人写作助理工具。 我们会利用 Dify 的 LLM 节点、变量传递、文本处理、知识库与多轮对话能力.

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 273

912. Sort an Array(Leetcode每日一题-2020.03.31)

Problem Given an array of integers nums, sort the array in ascending order. Example1 Input: nums = [5,2,3,1] Output: [1,2,3,5] Example2 Input: nums = [5,1,1,2,0,0] Output: [0,0,1,1,2,5] Solution S...

Bryan要加油 513

YOLO26涨点改进 | 全网独家复现、小目标检测改进篇 | TGRS 2025 | YOLO26引入MFAE-YOLO中的GFFP、FCPS 和 C3k2-FPEU创新点,涨点起飞,直接发论文

🔥本文给大家介绍在YOLO26中引入MFAE-YOLO中的 GFFP(全局特征融合处理)、FCPS(特征通道像素注意力) 和 C3k2-FPEU(特征池提取单元) 二次创新改进模块,能显著提升对小目标的检测性能。GFFP通过多尺度特征融合增强全局上下文感知能力,有效提升小目标在复杂背景下的可辨性;FCPS融合通道、像素和空间注意力机制,增强了模型对关键细节和小区域特征的关注,提升检测精度;C2F-FPEU利用多种池化方式挖掘细节特征,优化浅层特征表示能力。三者协同提升了YOLO26在小目标检测中的鲁棒性。

Ai缝合怪、助力小伙伴高效发论文 303

[LeetCode力扣hot100]-快速选择和快排

腾讯面经高频真题,这题看上去不难,但是难点是复杂度规定为O(n)如果用sort的话 就是O(nlogn)2.统计字符串含有大写字母A的个数。,但是只能收敛于O(n)。想要得到O(n),就要用。能做出来不太合规就是。

m0_62237233的博客 611

CAN总线介绍及硬件设计

1. CAN是什么 CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO*1 国际标准化的串行通信协议。 在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统 被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很 多,线束的数量也随之增加。为适应“减少线束的数量”、“......

sinat_15677011的博客 9989

第11节:GPU 线程层级:线程、线程块、网格

层级标识变量功能线程threadIdx执行单元,处理数据线程块blockIdx管理多个线程,提供共享内存网格管理多个 blockGPU 编程中,合理安排线程层级,是提升性能的关键。

yumeiguo的博客 209

[leetcode]排序算法(冒泡排序,选择排序,插入排序,快速排序,计数排序)

leetcode,排序算法,冒泡排序,python,timeit(),选择排序算法 快速排序,插入排序,归并排序,计数排序

是安澜啊 2303

SPICE框架:自博弈提升大语言模型推理能力

自博弈训练是提升大语言模型推理能力的前沿技术,其核心思想是通过模型自我对话实现持续迭代优化。SPICE框架创新性地采用文档驱动的自博弈机制,结合思维链提示和迭代式上下文扩展,显著提升模型在数学证明、逻辑推理等复杂任务中的表现。该技术在代码生成、金融分析等工程场景中展现出23%-41%的性能提升,其关键技术包括多样性控制、质量过滤和记忆管理。随着与RLAIF等强化学习方法的结合,这种训练范式正在推动大模型向更接近人类思维方式的推理能力进化。

weixin_28686771的博客 400

【Leetcode】912. Sort an Array

当然快速排序 + 插入排序也可以,但是因为归并排序和插入排序都是稳定的,所以用归并排序更加有道理些,可以保持数据稳定。先堆化整个数组,形成一个最大堆,然后将堆顶和数组倒数第一个数字交换,接着下滤堆顶元素,再将堆顶和数组倒数第二个数字交换,接着再下滤堆顶元素,这样一直操作下去即可。非递归归并排序完全就是模仿归并的过程,只不过步长是手动模拟的而已,排序过程其实十分显然。算法正确性证明和复杂度证明都很简单,这里省略。法3:归并排序,非递归版本。法2:归并排序,递归版本。空间复杂度:也假设每次选择的。

数学、算法爱好者的博客 983

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

912. Sort an Array排序复习 快速排序,选择排序,插入排序,归并排序,堆排序

Given an array of integersnums, sort the array in ascending order. Example 1: Input: nums = [5,2,3,1] Output: [1,2,3,5] Example 2: Input: nums = [5,1,1,2,0,0] Output: [0,0,1,1,2,5] Constraints: 1 <= nums.length <= 50000 -50000 <= nums[.

salmonwilliam的博客 645

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

快速排序算法(LeetCode版)

快速排序递归框架 public static void quickSort(int[] arr) { quickSort(arr, 0, arr.length - 1); } public static void quickSort(int[] arr, int start, int end) { // 将数组分区,并获得中间值的下标 int middle = partition(arr, start, end); // 对左边区域快速排序 quickSort(a..

菼执的博客 1194

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LeetCode-561. Array Partition I(Quick Sort快速排序)

561. Array Partition I 题目 Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1, b1), (a2, b2), …, (an, bn) which makes sum of min(ai, bi) for all i from...

家行hang的博客 303

Quick Sort

The basic step of sorting an array are as follows: Select a pivot, normally the middle one From both ends, swap elements and make left elements < pivot and all right > pivot Recursively so...

leetcode 解题思路 812

leetcode 912 quicksort快排模板

leetcode

- 回忆゛ 296

【leetcode】912. Sort an Array

题目如下: Given an array of integersnums, sort the array in ascending order. Example 1: Input:[5,2,3,1] Output: [1,2,3,5] Example 2: Input: [5,1,1,2,0,0] Output: [0,0,1,1,2,5] Note: ...

weixin_34129696的博客 320

***leetcode刷题_(quicksort,dutch partition problem)_code75(颜色分类)

code75: Sort Colors an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue. Here, we wi...

weixin_39238424的博客 228

912. Sort an Array(排序数组)———附带思路和完整代码

文章目录0 效果1 题目2 思路3 代码 0 效果 1 题目 2 思路 排序的API调用 3 代码 C++: class Solution { public: vector<int> sortArray(vector<int>& nums) { auto cmp = [](int a, int b)->bool { return a < b; }; std::sort(nums.b

韩江雪de 小屋 1244

待字闺中之快排单向链表;leetcode之Sort List

题目来源,待字闺中,原创@陈利人 ,欢迎大家继续关注微信公众账号“待字闺中” 分析:思路和数据的快速排序一样,都需要找到一个pivot元素、或者节点。然后将数组或者单向链表划分为两个部分,然后递归分别快排。 针对数组进行快排的时候,交换交换不同位置的数值,在分而治之完成之后,数据就是排序好的。那么单向链表是什么样的情况呢?除了交换节点值之外,是否有其他更好的方法呢?可以修改指针,不进行数值

fangjian1204的专栏 1461

Leetcode21.+Leetcode75. 归并排序和快速排序的实现

归并排序 快速排序

obrcnh的博客 3671

LeetCode 912. Sort an Array

Given an array of integersnums, sort the array in ascending order. Example 1: Input:[5,2,3,1] Output: [1,2,3,5] Example 2: Input: [5,1,1,2,0,0] Output: [0,0,1,1,2,5] Note: 1 <= A....

qq_39638957的博客 473

再看快速排序(QuickSort)

1.基本的快速排序 2.快排的优化 3.

懂幸福,爱生活 3177
上一篇: leetcode 427. Construct Quad Tree(构建四叉树)
下一篇: 实例分割 mask loss异常值,训练过程报错 debug记录
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值