【LeetCode Hot100 | 每日刷题】排序数组

912. 排序数组 - 力扣(LeetCode)

题目:

给你一个整数数组 nums,请你将该数组升序排列。

你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。

示例 1:

复制代码
输入:nums = [5,2,3,1]
输出:[1,2,3,5]

示例 2:

复制代码
输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

方法:快速排序

快速排序核心就是分而治之,在当前排序区间[L,R]选定一个元素X作为中间值,X可以是nums[L+1],nums[R-1],nums[(L+R)/2],下面我们选择nums[(L+R)/2]作为中间值,元素依次与X比较,小于X的元素在X左边,大于X的元素在X右边,并且再次递归排序左边的区间以及X右边的区间,直至整个数组完成排序。

Java实现代码:

java 复制代码
class Solution {
    public int[] sortArray(int[] nums) {
        int n=nums.length;
        quicksort(nums,0,n-1);
        return nums;
    }
    public void quicksort(int []nums,int l,int r){
        if(l==r)return;
        int x=nums[(l+r)/2];
        int i=l-1;
        int j=r+1;
        while(i<j){
            do i++;while(nums[i]<x);
            do j--;while(nums[j]>x);
            if(i<j){
                int tem=nums[i];
                nums[i]=nums[j];
                nums[j]=tem;
            }
        }
        quicksort(nums,l,j);
        quicksort(nums,j+1,r);
    }
}

平均时间复杂度:O(nlogn),最差时间复杂度为O(n^2),即每次取到的X都是当前区间的最大值或最小值,相当于冒泡排序了。

相关推荐
普通网友15 分钟前
C++中的组合模式
开发语言·c++·算法
2501_9411114625 分钟前
C++中的组合模式变体
开发语言·c++·算法
想唱rap42 分钟前
Linux下进程的状态和优先级
linux·运维·服务器·开发语言·数据结构·算法
普通网友1 小时前
单元测试在C++项目中的实践
开发语言·c++·算法
Croa-vo1 小时前
逆袭Akuna Quant!美硕秋招亲历,从网申到拿offer全攻略
数据结构·经验分享·算法·面试·职场和发展
强化学习与机器人控制仿真2 小时前
字节最新开源模型 DA3(Depth Anything 3)使用教程(一)从任意视角恢复视觉空间
人工智能·深度学习·神经网络·opencv·算法·目标检测·计算机视觉
Teacher.chenchong2 小时前
R语言实现物种分布预测与生态位分析:多元算法实现物种气候生态位动态分析与分布预测,涵盖数据清洗、模型评价到论文写作全流程
开发语言·算法·r语言
mit6.8242 小时前
高维状态机dp|环形dp
算法
Swift社区2 小时前
LeetCode 427 - 建立四叉树
算法·leetcode·职场和发展
u***j3243 小时前
算法设计模式总结
算法·设计模式