快速排序(QuickSort)-归并排序(MergeSort)[java编写]

news2025/1/6 18:03:15

1. 快速排序

1.1 基本概述

快速排序采用分治思想,即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot 将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。、

1.2 图解

1.3 快速排序的代码实现(java)

class QuickSort {
    public static void sort(int[] array) {
        sortSection(array, 0, array.length - 1);
    }
    
    private static void sortSection(int[] array, int start, int end) {
        // 递归的baseCase
        if(start >= end) {
            return;
        }
        // 递归分块并排序
        int p = partition(array,start,end);
        sortSection(array, start, p - 1);
        sortSection(array, p + 1, end);
    }
    
    /**
     * partition 方法目的在于将目标数组分以pivot为界,分为两部分,并返回pivot应在的的位置-                            
       biggest_smallest
     * @param array    目标数组
     * @param start    开始位置
     * @param end      结束位置
     * @return         返回分割后的pivot位置-biggest_smallest
     */
    
    private static int partition(int[] array,int start,int end) {
        int pivot = array[start];
        int biggest_smallest = start;
        int tmp;
        // 以pivot为隔板,小的放左边,大的放右边
        for(int i = start + 1; i <= end; i++) {
            if(array[i] < pivot) {
                biggest_smallest++;
                tmp = array[biggest_smallest];
                array[biggest_smallest] = pivot;
                array[i] = tmp;
            }
        }
        array[start] = array[biggest_smallest];
        array[biggest_smallest] = pivot;
        return biggest_smallest;
    }
}

1.4 快速排序的时间复杂度

快速排序是一种常用的排序算法,它的时间复杂度在不同情况下有所不同。在最佳情况下,快速排序的时间复杂度为O(n log n),而在最差的情况下,其时间复杂度为O(n ^ 2)。平均情况下,快速排序也能达到O(nlogn) 的时间复杂度。

快速排序的性能高度依赖于选择的基准值,如果每次能将数组分为两个大小大致相等的子数组,那么快速排序的效率最高。在这种情况下,排序过程可以看作是一个平衡二叉树,其中每个节点的操作时间为O(n),树的高度为O(logn)。因此,整个排序过程的时间复杂度为O(n logn)。

在最差情况下,如果每次选择的基准值都是最小或最大的元素,那么数组将不会被平均分割,导致递归深度为O(n),每次的操作时间仍未O(n),因此总的时间复杂度为O(n^2)。

尽管快速排序在最差情况下的时间复杂度较高,但由于其在平均情况下的高效性,以及它的就地排序特性(不需要额外的存储空间),快速排序通常优于其他排序算法,如归并排序。此外,快速排序的局部性引用优势使得它在实际应用中的表现通常比理论分析更好。

1.5 快速排序的空间复杂度

快速排序的空间复杂度主要由递归调用栈产生。在最佳情况下,递归树的深度为O(log n),因此空间复杂度也为O(log n),在最差的情况下,递归树退化为线性链,空间复杂度为O(n)。平均情况下,空间复杂度同样为O(log n)。

2. 归并排序

2.1 基本概述

归并排序是一种高效的排序算法,由约翰.冯.诺依曼于1945年发明,它利用了分治法(Divide and Conquer) 的策略来实现排序。归并排序的核心思想是将一个大问题分解成小问题解决,然后将小问题的解决结果合并以解决原来的大问题。

归并排序将待排序的数组分成两部分,对每部分递归地应用归并排序,然后将两个有序的子数组合并成一个有序的数组。这个过程一直重复,直到数组完全有序。归并排序的过程可以用一棵完全二叉树来形象地表示,其中每个节点表示一个排序操作或合并操作。

2.2 图解

先拆分

后合并

2.3 归并排序的代码实现

class MergeSort {
    public static void sort(int [] array){
        sortSection(array,0,array.length - 1);
    }
    private static void sortSection(int[] array,int start,int end){
        // 递归的baseCase
        if(start == end) {
            return;
        }
        // 通过递归实现了数据按归并排序算法的拆分
        int mid = (start + end) / 2;
        sortSection(array,start,mid);
        sortSection(array,mid + 1,end);
        // 调用merge方法对数据进行合并
        merge(array,start,mid + 1,end);
    }

    /*
    merge 方法实现了两块数据的合并阶段
    */
    private static void merge(int[] array,int start,int start2,int end) {
        int len1 = start2 - start;
        int[] tmp = new int[len1];
        System.arraycopy(array,start,tmp,0,len1);
        int p1 = 0;
        int p2 = start2;
        for(int i = start;i <= end;i++) {
            if(tmp[p1] <= array[p2]) {
                array[i] = tmp[p1];
                p1++;
                if(p1 == len1) {
                    break;
                }
            }else {
                array[i] = array[p2];
                p2++;
                if(p2 > end){
                    while(p1 < len1){
                        i++;
                        array[i] = tmp[p1];
                        p1++;
                    }
                }
            }
        }
    }
}

2.4 归并排序的时间复杂度

归并排序是一种基于分治法的有效排序算法,它将一个数组分为两个子数组,递归地将子数组分到只有一个元素,然后合并这些子数组以使整个数组有序。归并排序的一个关键步骤是合并两个已排序的子数组,这个过程需要遍历所有元素以确保它们正确排序。

归并排序的时间复杂度主要由两个部分组成:数组分割和数组合并。在分割阶段,数组被递归地分成两半,直到每个子数组只有一个元素,这个过程的时间复杂度是O(og n),因为每次风格都将数组的大小减半。在合并阶段,每个元素都需要被比较和移动以合并两个字数组,这个过程的时间复杂度是O(n)。

因此,归并排序的总体时间复杂度是O(n log n),这是因为每个分割步骤都需要一次完整的元素合并。这个时间复杂度使用于最好,最坏和平均情况,因为无论数组的初始顺序如何,分割和合并的步骤都是固定的。

2.5 归并排序的空间复杂度

归并排序的空间复杂度是O(n),这是因为合并过程需要与原始数组相同数量的额外空间来存储合并后的数组。这个额外的空间通常是通过一个临时数组来实现的,临时数组在整个排序过程中用与存储合并的结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2112972.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Chapter 10 Stability and Frequency Compensation

Chapter 10 Stability and Frequency Compensation Chapter 8介绍了负反馈, 这一章介绍稳定性, 如果设计不好, 负反馈系统是要发生震荡的. 首先我们学习理解稳定判断标准和条件, 然后学习频率补偿, 介绍适用于不同运放的补偿方式, 同时介绍不同补偿对两级运放slew rate的影响…

2024全新苹果cms影视源码/仿韩剧TV主题模板源码/电影视频在线观看网站源码-自适应 (PC+WAP)

源码简介 2024年最新版的苹果CMS影视源码&#xff0c;仿制了韩剧TV的主题模板&#xff0c;让网站看起来跟韩剧TV一模一样&#xff0c;而且这个源码支持在线观看电影和视频&#xff0c;无论是在电脑&#xff08;PC&#xff09;还是手机&#xff08;WAP&#xff09;上都能完美自…

网络编程之-UDP详解

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a; c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 &#x1f3c0…

2024年 Biomedical Signal Processing and Control 期刊投稿经验最新分享

期刊介绍 《Biomedical Signal Processing and Control 》期刊旨在为临床医学和生物科学中信号和图像的测量和分析研究提供一个跨学科的国际论坛。重点放在处理在临床诊断&#xff0c;患者监测和管理中使用的方法和设备的实际&#xff0c;应用为主导的研究的贡献。 生物医学信…

【大模型基础】P1 N-Gram 模型

目录 N-Gram 概述N-Gram 构建过程TokenN-Gram 实例第1步 构建实验语料库第2步 把句子分成 N 个 “Gram”第3步 计算每个 Bigram 在语料库中的词频第4步 计算出现的概率第5步 生成下一个词第6步&#xff1a;输入前缀&#xff0c;生成连续文本 上述实例完整代码N-Gram 的局限性 N…

一文理解粒子滤波

0. 粒子滤波流程 之前学习记录的文档&#xff0c;这里也拿出来分享一下~ 基本原理&#xff1a;随机选取预测域的 N NN 个点&#xff0c;称为粒子。以此计算出预测值&#xff0c;并算出在测量域的概率&#xff0c;即权重&#xff0c;加权平均就是最优估计。之后按权重比例&…

揭秘帕金森症幕后元凶:是哪些因素悄悄“震颤”了生活?

在这个快节奏的时代&#xff0c;健康成为了我们最宝贵的财富之一。然而&#xff0c;有一种名为“帕金森病”的神秘疾病&#xff0c;正悄悄影响着无数人的生活&#xff0c;让他们的日常充满了“不由自主”的颤抖。今天&#xff0c;就让我们一起揭开帕金森症的神秘面纱&#xff0…

【电路笔记】-同相运算放大器

同相运算放大器 文章目录 同相运算放大器1、概述2、理想的同相运算放大器3、实际同相运算放大器3.1 闭环增益3.2 输出阻抗3.3 输入阻抗4、同相运算放大器示例4.1 缓冲电路4.2 示例5、总结1、概述 施加到运算放大器的电压信号可以提供给其同相输入端 (+) 或反相输入端 (-)。 这…

ansible--role

简介 roles是ansible&#xff0c;playbooks的目录的组织结构&#xff0c;将代码或文件进行模块化&#xff0c;成为roles的文件目录组织结构。 易读&#xff0c;代码可冲哟美好&#xff0c;层次清晰 目录机构 mkdir roles/nginx/{files,handlers,tasks,templates,vars} -ptou…

LLM模型:代码讲解Transformer运行原理

视频讲解、获取源码&#xff1a;LLM模型&#xff1a;代码讲解Transformer运行原理(1)_哔哩哔哩_bilibili 1 训练保存模型文件 2 模型推理 3 推理代码 import torch import tiktoken from wutenglan_model import WutenglanModelimport pyttsx3# 设置设备为CUDA&#xff08;如果…

javaWeb【day04】--(MavenSpringBootWeb入门)

01. Maven课程介绍 1.1 课程安排 学习完前端Web开发技术后&#xff0c;我们即将开始学习后端Web开发技术。做为一名Java开发工程师&#xff0c;后端Web开发技术是我们学习的重点。 1.2 初识Maven 1.2.1 什么是Maven Maven是Apache旗下的一个开源项目&#xff0c;是一款用于…

数据治理:企业数字化转型的关键环节

数据治理&#xff1a;企业数字化转型的关键环节 前言数据治理&#xff1a;企业数字化转型的关键环节 前言 在当今数字化时代&#xff0c;企业的发展与数据紧密相连。数据已成为企业的重要资产&#xff0c;而如何有效地治理数据&#xff0c;使其发挥最大价值&#xff0c;成为企…

Python安装llama库出错“metadata-generation-failed”

Python安装llama库出错“metadata-generation-failed” 1. 安装llama库时出错2. 定位问题1. 去官网下载llama包 2.修改配置文件2.1 解压文件2.2 修改配置文件 3. 本地安装文件 1. 安装llama库时出错 2. 定位问题 根据查到的资料&#xff0c;发现时llama包中的execfile函数已经…

旋翼无人机的应用场景和用途!!!

1. 航拍摄影 全景拍摄&#xff1a;旋翼无人机可以携带摄像装置进行大规模航拍&#xff0c;广泛应用于影视制作、广告拍摄、城市规划、房地产宣传等领域。其独特的视角和高度&#xff0c;能够拍摄到地面难以捕捉的壮丽景色&#xff0c;为观众带来震撼的视觉效果。 测绘与地理信…

USB通信协议基础概念

文章目录 一、什么是USB1. **标准化接口**2. **热插拔**3. **即插即用**4. **电源供给**5. **数据传输速度**6. **连接类型**7. **协议和功能** 二、USB的三个部分1. **USB Host&#xff08;主机&#xff09;**2. **USB Device&#xff08;设备&#xff09;**3. **USB Hub&…

Ubuntu 22.04 make menuconfig 失败原因

先 安装一些配置 linux下使用menuconfig需要安装如下库_menuconfig 安装-CSDN博客 然后 cd 到指定源代码 需要在内核文件目录下编译 Linux 内核源码&#xff08;kernel source&#xff09;路径_--kernel-source-path-CSDN博客 make menuconfig 又报错 说是gcc 12什么什么&…

Linux概述、远程连接、常用命令

Linux介绍 Linux操作系统介绍 Linux操作系统的特点 开源免费安全稳定可移植性好 Linux可以安装在不同的设备上 高性能 Linux的使用领域 应用服务器数据库服务器网络服务器虚拟化云计算嵌入式领域个人PC移动手机 Linux文件系统和目录 /&#xff1a;根目录&#xff0c;唯一/h…

RT-Thread(Nano版本)的快速移植(基于NUCLEO-F446RE)

目录 概述 1 RT-Thread 1.1 RT-Thread的版本 1.2 认识Nano版本 2 STM32F446U上移植RT-Thread 2.1 STM32Cube创建工程 2.2 移植RT-Thread 2.2.1 安装RT-Thread Packet 2.2.2 加载RT-Thread 2.2.3 匹配相关接口 2.2.3.1 初次编译代码 2.2.3.2 匹配端口 2.2.4 移植FinSH…

基于飞腾平台的Hive的安装配置

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力&#xff0c;聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域&#xff0c;包含了应用使能套件、软件仓库、软件支持、软件适…

Matplotlib 颜色设置详解

在使用matplotlib进行颜色绘制的时候,如绘制图表、背景色或者对文字设置的时候都可以配置颜色, 以下说明主流的三种颜色使用方法 颜色名称 可以是直接使用颜色名称的字符串对color进行赋值,包括可以使用首字母缩写或者完整拼写的形式,以下为部分颜色的书写形式 缩写版 • …