递归与非递归方式实现随机快排

简介: 递归与非递归方式实现随机快排

建议可以先看看这篇文章,可以更好理解随机快排——随机快排时间复杂度是N平方?(讲述了数组分区、荷兰国旗问题,快排1.0版本如何进化到快排3.0版本)

package com.harrison.class03;

import javax.annotation.Resources;
import java.util.Stack;

/**
 * @author Harrison
 * @create 2022-02-28-15:15
 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。
 */
public class Code07_QuickSortRecursiveAndUnrecursive {
    public static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

    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};
    }

    // 快速排序递归版本
    public static void quickSort1(int[] arr){
        if(arr==null || arr.length<2){
            return ;
        }
        process1(arr,0,arr.length-1);
    }

    public static void process1(int[] arr,int L,int R){
        if(L>=R){
            return ;
        }
        swap(arr,L+(int)(Math.random()*(R-L+1)),R);
        int[] lessEqual=netherlandsFlag(arr,L,R);
        process1(arr,L,lessEqual[0]-1);
        process1(arr,lessEqual[1]+1,R);
    }

    // 快速排序非递归版本辅助类
    // 要处理的是什么范围上的排序
    public static class Op{
        public int l;
        public int r;

        public Op(int left,int right){
            l=left;
            r=right;
        }
    }

    // 快速排序非递归版本
    public static void quickSort2(int[] arr){
        if(arr==null || arr.length<2){
            return ;
        }
        int N=arr.length;
        swap(arr,(int)(Math.random()*N),N-1);
        int[] equalArea=netherlandsFlag(arr,0,N-1);
        Stack<Op> stack=new Stack<>();
        stack.push(new Op(0,equalArea[0]-1));
        stack.push(new Op(equalArea[1]+1, N-1));
        while(!stack.isEmpty()){
            Op op=stack.pop();
            if(op.l<op.r){
                swap(arr,op.l+(int)(Math.random()*(op.r-op.l+1)),op.r);
                equalArea=netherlandsFlag(arr,op.l,op.r);
                stack.push(new Op(op.l,equalArea[0]-1));
                stack.push(new Op(equalArea[1]+1, op.r));
            }
        }
    }

    public static int[] generateRandomArray(int maxSize, int maxValue) {
        int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
        }
        return arr;
    }

    // 拷贝数组(用于测试)
    public static int[] copyArray(int[] arr) {
        if (arr == null) {
            return null;
        }
        int[] res = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            res[i] = arr[i];
        }
        return res;
    }

    // 对比两个数组(用于测试)
    public static boolean isEqual(int[] arr1, int[] arr2) {
        if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
            return false;
        }
        if (arr1 == null && arr2 == null) {
            return true;
        }
        if (arr1.length != arr2.length) {
            return false;
        }
        for (int i = 0; i < arr1.length; i++) {
            if (arr1[i] != arr2[i]) {
                return false;
            }
        }
        return true;
    }

    // 打印数组(用于测试)
    public static void printArray(int[] arr) {
        if (arr == null) {
            return;
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }

    // 跑大样本随机测试(对数器)
    public static void main(String[] args) {
        int testTime = 500000;
        int maxSize = 100;
        int maxValue = 100;
        boolean succeed = true;
        System.out.println("test begin");
        for (int i = 0; i < testTime; i++) {
            int[] arr1 = generateRandomArray(maxSize, maxValue);
            int[] arr2 = copyArray(arr1);
            quickSort1(arr1);
            quickSort2(arr2);
            if (!isEqual(arr1, arr2)) {
                succeed = false;
                break;
            }
        }
        System.out.println("test end");
        System.out.println("测试" + testTime + "组是否全部通过:" + (succeed ? "是" : "否"));
    }
}
相关文章
|
机器学习/深度学习 算法 数据挖掘
【数据挖掘】神经网络与感知机基础概念讲解(图文解释 超详细)
【数据挖掘】神经网络与感知机基础概念讲解(图文解释 超详细)
492 0
【数据挖掘】神经网络与感知机基础概念讲解(图文解释 超详细)
|
机器学习/深度学习 编解码 PyTorch
StyleGAN的PyTorch实现
StyleGAN的PyTorch实现
338 0
|
5月前
|
人工智能 分布式计算 DataWorks
多模态数据处理新趋势:阿里云ODPS技术栈深度解析与未来展望
阿里云ODPS技术栈通过MaxCompute、Object Table与MaxFrame等核心组件,实现了多模态数据的高效处理与智能分析。该架构支持结构化与非结构化数据的统一管理,并深度融合AI能力,显著降低了分布式计算门槛,推动企业数字化转型。未来,其在智慧城市、数字医疗、智能制造等领域具有广泛应用前景。
520 6
多模态数据处理新趋势:阿里云ODPS技术栈深度解析与未来展望
|
9月前
|
存储 人工智能 前端开发
vue3.5接入deepseek-v3网页版ai流式多轮聊天问答助手
vue3-deepseek-webai:原创新作vite6+vue3.5+deepseek-v3+arco-design实战一款高颜值网页版ai多轮输出对话小助手。
1017 14
|
机器学习/深度学习 自然语言处理 算法
大型语言模型:SBERT — 句子BERT
大型语言模型:SBERT — 句子BERT
|
11月前
|
人工智能 文字识别 API
moonshot-v1-vision-preview:月之暗面Kimi推出多模态视觉理解模型,支持图像识别、OCR文字识别、数据提取
moonshot-v1-vision-preview 是月之暗面推出的多模态图片理解模型,具备强大的图像识别、OCR文字识别和数据提取能力,支持API调用,适用于多种应用场景。
1560 6
moonshot-v1-vision-preview:月之暗面Kimi推出多模态视觉理解模型,支持图像识别、OCR文字识别、数据提取
|
Web App开发 数据采集 移动开发
提升Selenium在Chrome上的HTML5视频捕获效果的五个方法
在Selenium中优化Chrome的HTML5视频捕获涉及更新Chrome和ChromeDriver、配置浏览器选项、使用代理IP、调整加载策略及确保安装了正确编解码器。例如,更新驱动程序,添加如`--autoplay-policy`和`--proxy-server`的命令行参数,使用代理以防止被封,设置页面加载策略为&#39;eager&#39;,并安装必要的编解码器来确保视频播放。代码示例展示了如何集成这些优化措施。
503 2
提升Selenium在Chrome上的HTML5视频捕获效果的五个方法
Springboot如何发送邮件
Springboot如何发送邮件
169 0
|
JSON 算法 C语言
【leecode刷题】各种哈希表最全面总结----以217. 存在重复元素为例
【leecode刷题】各种哈希表最全面总结----以217. 存在重复元素为例
325 0
【leecode刷题】各种哈希表最全面总结----以217. 存在重复元素为例
|
机器学习/深度学习 人工智能 自然语言处理
【论文精读】AAAI 2022 - Unified Named Entity Recognition as Word-Word Relation Classification
到目前为止,命名实体识别(NER)已经涉及三种主要类型,包括扁平、重叠(又名嵌套)和不连续NER,它们大多是单独研究的。
496 0
【论文精读】AAAI 2022 - Unified Named Entity Recognition as Word-Word Relation Classification