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;
    } 
}
相关推荐
徐小黑ACG25 分钟前
Golang 基础05 结构体struct
开发语言·算法·golang
Navigator_Z1 小时前
LeetCode //C - 1286. Iterator for Combination
c语言·算法·leetcode
北极有牛1 小时前
cpp学习笔记--常量指针
java·开发语言·算法
GPU实战笔记1 小时前
云端 GPU 训练的账户余额提醒:它能说明什么,不能说明什么?
深度学习·算法·成本管理·gpu云计算·云端训练
浮链序2 小时前
怎么证明"你这个模型是偷我的"——把蒸馏变成取证工具
算法·安全·llm
小O的算法实验室2 小时前
IEEE TMC,面向异构物联网的多目标量子行为拓扑优化算法
算法
liliangcsdn3 小时前
派息率指标的应用探索和分析
大数据·算法
垆边人似月.3 小时前
华为机试题 :两数之和
c++·算法·华为
默默开发3 小时前
物流行业可用算法方向
算法
垆边人似月.3 小时前
华为机试题 :有效的括号
c++·算法·华为