912. 排序数组

目录

题目链接

题目

解题思路

代码


题目链接

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

题目

解题思路

法一:使用内置方法(过是能过,但是不符合题目要求)(超时)
法二:使用简单的快速排序(每次以left索引为目标值进行判断),时间复杂度高(超时)
法三:随机索引的快速排序(勉强过,相同元素会重复交换)
法四:双路快排
法五:三路快排
代码

法一:内置方法

java 复制代码
class Solution {
    public int[] sortArray(int[] nums) {
        Arrays.sort(nums);
        return nums;
    }
}

法二:快速排序(固定索引)

java 复制代码
class Solution {
    public int[] sortArray(int[] nums) {
        quickSort(nums,0,nums.length-1);
        return nums;
    }
    public void quickSort(int[] nums,int left,int right){
        if(left>=right){
            return ;
        }
        int partiIndex=partition(nums,left,right);
        quickSort(nums,left,partiIndex-1);
        quickSort(nums,partiIndex+1,right);
    }
    public int partition(int[] nums,int left,int right){
        int privot=nums[left];
        int j=left;
        for(int i=left+1;i<=right;i++){
            if(nums[i]<=privot){
                j++;
                swap(nums,i,j);
            }
        }
        swap(nums,left,j);
        return j;
    }
    public void swap(int[] nums,int i ,int j){
        int temp=nums[i];
        nums[i]=nums[j];
        nums[j]=temp;
    } 
}

法三:随机索引

java 复制代码
import java.util.Random;
class Solution {
    private final static Random random=new Random(System.currentTimeMillis());
    public int[] sortArray(int[] nums) {
        quickSort(nums,0,nums.length-1);
        return nums;
    }
    public void quickSort(int[] nums,int left,int right){
        if(left>=right){
            return ;
        }
        int partiIndex=partition(nums,left,right);
        quickSort(nums,left,partiIndex-1);
        quickSort(nums,partiIndex+1,right);
    }
    public int partition(int[] nums,int left,int right){
        int idx=left+ random.nextInt(right-left+1);
        swap(nums,idx,left);
        int privot=nums[left];
        int j=left;
        for(int i=left+1;i<=right;i++){
            if(nums[i]<privot){
                j++;
                swap(nums,i,j);
            }
        }
        swap(nums,left,j);
        return j;
    }
    public void swap(int[] nums,int i ,int j){
        if(nums[i]==nums[j]) return ;
        int temp=nums[i];
        nums[i]=nums[j];
        nums[j]=temp;
    } 
}

法四:双路快排

java 复制代码
import java.util.Random;
class Solution {
    private final static Random random=new Random(System.currentTimeMillis());
    public int[] sortArray(int[] nums) {
        quickSort(nums,0,nums.length-1);
        return nums;
    }
    public void quickSort(int[] nums,int left,int right){
        if(left>=right){
            return ;
        }
        int partiIndex=partition(nums,left,right);
        quickSort(nums,left,partiIndex-1);
        quickSort(nums,partiIndex+1,right);
    }
    public int partition(int[] nums,int left,int right){
        int idx=left+ random.nextInt(right-left+1);
        swap(nums,idx,left);
        int val=nums[left];
        int le=left+1;
        int ge=right;
        while(true){
            while(le<=ge &&nums[le]<val){
                le++;
            }
            while(le<=ge && nums[ge]>val){
                ge--;
            }
            if(le>=ge){
                break;
            }
            swap(nums,le,ge);
            le++;
            ge--;
        }
        swap(nums,left,ge);
        return ge;
    }
    public void swap(int[] nums,int i ,int j){
        if(nums[i]==nums[j]) return ;
        int temp=nums[i];
        nums[i]=nums[j];
        nums[j]=temp;
    } 
}

法五:三路快排

java 复制代码
import java.util.Random;
class Solution {
    private final static Random random=new Random(System.currentTimeMillis());
    public int[] sortArray(int[] nums) {
        quickSort(nums,0,nums.length-1);
        return nums;
    }
    public void quickSort(int[] nums,int left,int right){
        if(left>=right){
            return ;
        }
        int idx=left+ random.nextInt(right-left+1);
        swap(nums,idx,left);
        int val=nums[left];
        int lt=left+1;
        int gt=right;
        int i=lt;
        while(i<=gt){
            if(nums[i]==val){
                i++;
            }else if(nums[i]<val){ 
                swap(nums,lt,i);
                lt++;
                i++;
            }else{
                swap(nums,gt,i);
                gt--;
            }
        }
        swap(nums,left,lt-1);
        quickSort(nums,left,lt-2);
        quickSort(nums,gt+1,right);
    }
 

 
    public void swap(int[] nums,int i ,int j){
        if(nums[i]==nums[j]) return ;
        int temp=nums[i];
        nums[i]=nums[j];
        nums[j]=temp;
    } 
}
相关推荐
wabs6665 小时前
关于图论【卡码网117.软件构建的思考】
数据结构·算法·软件构建·图论·卡码网
mifengxing5 小时前
LeetCode 41.缺失的第一个正数|Hard题O(n)+O(1)最优解法深度解析
java·算法·leetcode·排序算法
Tongzhi20266 小时前
从部署到运维:通芝科技无感考勤一体机的全流程效率解析
运维·数据结构·科技·算法·贪心算法
Wang's Blog6 小时前
AI Agent白手起家30: 动态示例选择器之根据长度选择 Few Shot 示例
算法
oyguyteggytrrwwwrt8 小时前
自制交叉线路识别算法
算法
手写码匠8 小时前
华为云Flexus+DeepSeek征文|Dify 多智能体协同编排实战:R1 规划 + V3 执行,构建企业 Agent 团队
人工智能·深度学习·算法·aigc
晓天衡宇•评测社区9 小时前
FSR-Bench 前沿科学推理榜单发布:GPT-5.5 居首,“会推理”未必“能答对”
算法
程序喵大人10 小时前
【C++进阶】STL算法与函数对象 - 02 sort为什么需要随机访问迭代器
开发语言·c++·算法
hanlin0310 小时前
动态规划专练:力扣第121、122题
笔记·算法·leetcode
To_OC10 小时前
LC 74 搜索二维矩阵:换皮的二分查找,我居然一开始没看出来
javascript·算法·leetcode