快排的3种方式

复制代码
//(前两种时间复杂度为o(n^2) , 最后一种为o(n*logn)

public static void swap(int[] arr , int i , int j){
    arr[i] =arr[i] ^arr[j];
    arr[j] =arr[i] ^arr[j];
    arr[i] =arr[i] ^arr[j];
}
//使数组中以arr[R]划分,返回循环后arr[R]的所在地
public static int partition(int[] arr , int L ,int R ){
    if(L >R ){
        return -1;
    }
    if(L == R ){
        return L;
    }
    int lessEqual = L-1;
    int index = L;
    while (index <R ){
        if(arr[index] <=arr[R]){
            swap(arr ,index++ , ++lessEqual);
        }
    }
    swap(arr , ++lessEqual , R);
    return lessEqual;
}

//把一个数组以arr[R]划分,返回的是值为arr[R]的区间
public static int[] netherlandsFlag(int[] arr , int L , int R){
    if(L>R){
        return new int[] { -1 ,-1};
    }
    if(L ==R){
        return new int[] {L ,R};
    }
    int less = L-1;
    int more =R;
    int index = L;
    while (index <more){
        if(arr[index] ==arr[R]){
            index++;
        }else if(arr[index] <arr[R]){
            swap(arr ,index++ , ++less);
        }else{
            swap(arr ,index , --more);
        }
    }
    swap(arr ,more ,R );
    return new int[] {less+1 , more};
}
//递归1
public static void process1(int[] arr ,int L ,int R ){
    if(L >=R){
        return;
    }
    int M =partition(arr ,L ,R);
    process1(arr , L , M-1);
    process1(arr , M+1 ,R);
}
//快排1
public static void quickSort1(int[] arr){
    if(arr ==null || arr.length <2){
        return;
    }
    process1(arr ,0 , arr.length-1);
}

//递归2
public static void process2(int[] arr ,int L ,int R){
    if(L >=R){
        return;
    }
    int[] equalArea =netherlandsFlag(arr ,L ,R);
    process2(arr ,L ,equalArea[0] -1);
    process2(arr , equalArea[1] , R);
}
//快排2
public static void quickSort2(int[] arr){
    if(arr ==null || arr.length <2){
        return;
    }
    process2(arr ,0 , arr.length-1);
}

//递归3
public static void process3(int[] arr , int L ,int R){
    if(L > R ){
        return;
    }
    swap(arr ,L + (int) (Math.random() * (R - L+1)), R);
    int[] equalArea = netherlandsFlag(arr , L ,R);
    process3(arr , L , equalArea[0] -1);
    process3(arr , equalArea[1] +1, R );
}
//快排3
public static void quickSort3(int[] arr){
    if(arr == null ||arr.length <2){
        return;
    }
    process3(arr , 0  , arr.length-1);
}
相关推荐
BullSmall2 分钟前
SEDA (Staged Event-Driven Architecture, 分阶段事件驱动架构
java·spring·架构
无限码力25 分钟前
科大讯飞秋招笔试真题 - 字符拼接 & 字典序最小的字符串拼接 & 圆心覆盖
算法·秋招·科大讯飞·科大讯飞笔试真题
Lips61127 分钟前
第四章 决策树
算法·决策树·机器学习
Coder_Boy_30 分钟前
基于SpringAI的在线考试系统-DDD(领域驱动设计)核心概念及落地架构全总结(含事件驱动协同逻辑)
java·人工智能·spring boot·微服务·架构·事件驱动·领域驱动
YuTaoShao37 分钟前
【LeetCode 每日一题】2053. 数组中第 K 个独一无二的字符串
算法·leetcode·职场和发展
黎雁·泠崖43 分钟前
Java&C语法对比:分支与循环结构核心全解析
java·c语言
鹿角片ljp1 小时前
Java IO流案例:使用缓冲流恢复《出师表》文章顺序
java·开发语言·windows
毕设源码-郭学长1 小时前
【开题答辩全过程】以 广告投放管理系统为例,包含答辩的问题和答案
java
小北方城市网1 小时前
SpringBoot 集成 RabbitMQ 实战(消息队列解耦与削峰):实现高可靠异步通信
java·spring boot·python·微服务·rabbitmq·java-rabbitmq·数据库架构
java_t_t1 小时前
Maven插件apiscan介绍与使用
java·maven·api文档·maven插件