合并排序与快速排序算法

2023-05-16

文章目录

  • 算法介绍
  • 代码实现
    • 1.合并排序
    • 2.快速排序
  • 总结


算法介绍

合并排序与快速排序是排序算法中常用的两种排序算法,合并排序把数据分为两段,从两段中逐个选最小的元素移入新数据的末尾;快速排序是在序列中挑选一个元素(本文中为首位元素),将小于该元素的放在该元素之前,大于的放于该元素之后,再分别对元素前后两段序列进行排序。

代码实现

1.合并排序

实现思路: 将数组通过折中不断细分成若干子序列,对最短两元素的子序列进行两两比较后得到若干有序序列,不断两两合并这些子序列,并通过比较两个序列首部元素大小进行排列,最终合并得到有序的序列。
时间复杂度: O(nlogn)
空间复杂度: O(n)
代码如下:

public static void mergeSort(int[] arr, int left, int right) {
        if (left < right) {
            int i = (left + right) / 2;
            //递归调用,对左侧进行排序
            mergeSort(arr, left, i);
            //递归调用,对右侧进行排序
            mergeSort(arr, i + 1, right);

            merge(arr, left, i, right);
        }
    }

    //arr[1:m] arr[m+1:r]
    public static void merge(int[] arr, int l, int m, int r) {
        int len1 = m - l + 1;
        int len2 = r - m;
        //构造数组left,right分别存储左右侧元素
        int[] left = new int[len1];
        int[] right = new int[len2];
        for (int n1 = 0; n1 < len1; n1++) {
            left[n1] = arr[l + n1];
        }
        for (int n1 = 0; n1 < len2; n1++) {
            right[n1] = arr[m + 1 + n1];
        }
        int i = 0, j = 0;
        int k = l;
        //将数组元素值两两比较,并合并到arr数组相应位置
        while (i < len1 && j < len2)
        {
            if (left[i] <= right[j])
                arr[k++] = left[i++];
            else
                arr[k++] = right[j++];
        }
        //判断超出部分并进行拼接
        if (i >= len1) {
            for (int n1 = j; n1 < len2; n1++) {
                arr[k++] = right[n1];
            }
        }
        if (j >= len2) {
            for (int n1 = i; n1 < len1; n1++) {
                arr[k++] = left[n1];
            }
        }
    }

2.快速排序

实现思路: 将数组头部元素与后续元素进行比较,通过首尾双指针(首指针找大于头部元素的元素,尾指针找小于头部元素的元素,找到则进行交换,直到首指针等于尾指针,最后将头部元素与首指针元素进行交换)使得头部元素(已换位)前的元素均小于自身,后的元素均大于自身,然后对头部元素(已换位)前的元素子序列、后的元素子序列不断重复以上过程,直到子序列长度等于1。
时间复杂度: O(nlogn)
空间复杂度: O(logn)
代码如下:

public static void quickSort(int[] arr, int begin, int end) {
        //长度小于1结束递归
        if (begin > end) {
            return;
        }
        int tmp = arr[begin];
        int i = begin, j = end;
        //首指针i等于尾指针j结束循环
        while (i != j) {
            //j在前面,因为尾指针j先出发
            //从后往前找,直到找到比tmp小的元素
            while (arr[j] >= tmp && i < j) {
                j--;
            }
            //从前往后找,直到找到比tmp大的元素
            while (arr[i] <= tmp && i < j) {
                i++;
            }
            //将两元素进行调换
            int t = arr[i];
            arr[i] = arr[j];
            arr[j] = t;
        }
        //将头元素与中间元素进行调换
        arr[begin] = arr[i];
        arr[i] = tmp;
        //对左边进行快速排序
        quickSort(arr, begin, i - 1);
        //对右边进行快速排序
        quickSort(arr, i + 1, end);
    }

总结

实践出真知,只有自己动手写才能充分感受到算法的巧妙与设计难度,在一步一步代码实现的过程中充分理解算法的思想,不断巩固,不断进步!最后补充常用排序算法及其复杂度分析,具体如下图:
常用排序算法

参考《算法程序设计 》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

合并排序与快速排序算法 的相关文章

  • react之jsx语法规则

    希望在之后的日子里 xff0c 能够时常更新 xff01 定义虚拟DOM时 xff0c 不要写引号 标签中混入JSX表达式时 xff0c 要用 样式的类名不要用class属性 xff0c 要是用clsaaName属性 lt h1 class
  • 电子凭证文件上传

    最近 xff0c 一直在做一些关于文件上传 xff0c 以及凭证导出打印的工作 xff0c 做一些记录 xff0c 方便日后的查阅 对了 xff0c 我在这里用的是antDesign这个第三方组件 文件上传 vue模板中 lt p gt l
  • 可视化图表API格式要求有哪些?Sugar BI详细代码示例(2)

    Sugar BI中的每个图表可以对应一个数据 API xff0c 用户浏览报表时 xff0c 选定一定的过滤条件 xff0c 点击 查询 按钮将会通过 API 拉取相应的数据 xff1b 前面说过 xff0c 为了确保用户数据的安全性 xf
  • "Warning: GetWindowMenuPopup failed! "

    对mdi程序中一个弹出菜单警告原因的分析 作者 laomai 网址 http blog csdn net laomai xff08 转载时请注明出处 xff09 一 引子 最近在编译一个别人的mdi程序代码 xff0c 在调试程序时 vc6
  • div仿input的使用

    需求描述 xff0c 输入框支持文本输入 xff0c 以及支持标签在对应节点的插入 1 首先封装组件 xff0c 通过父子组件传参的方式进行数据的处理 用富文本插件体积略大通过div标签的contenteditable属性来处理成仿inpu
  • 关于优雅去重的一些感想

    也就不赘述有的没的 xff0c 看代码 1 通过reduce 方法进行去重 this pageDataList 61 this pageDataList reduce tempArr item 61 gt if tempArr findIn
  • java形参的改变会影响实参吗?

    java形参的改变会影响实参吗 xff1f 昨天做题的时候遇到了这个问题 xff08 如图所示 xff09 xff0c 传入的参数是int 数组 xff0c 实参跟着形参一起改变了 但是之前传入int型参数时形参的改变是不会影响实参的 所以
  • 快速教你数据清洗的步骤及方法,不可错过

    说起数据清洗 xff0c 可能会有些小伙伴会觉得这一步可以忽略掉 xff0c 但是 xff01 作为混迹在数据分析这一块多年的老油条 xff0c 小编在此严肃地声明 xff01 资料清理是资料处理中最不能被忽略的部分 xff0c 它是资料分
  • 阿里八年大佬,分享三款值得推荐的开源接口测试工具

    三款值得推荐的开源接口测试工具 接口测试可以测试APIs Application Programming Interface 是否符合功能 xff0c 可靠性 xff0c 性能和安全要求 接口测试对于成功的CI DevOps来说至关重要 J
  • Gazebo的安装&与ROS的连接

    一 安装 1 添加源 span class token function sudo span span class token function sh span c span class token string 39 echo 34 de
  • 3d仿真文献综述

    文献综述 Vincent文论创新点Digital Twin based synchronised control and simulation of the industrial robotic cell using Virtual Rea
  • MATLAB多个子图 用一个 colorbar

    多个子图使用同一个colorbar left bottom width height ps42 61 zeros 8 4 ps42 3 61 0 44 ps42 4 61 0 20 ps42 7 8 2 61 0 08 ps42 5 6 2
  • ARS_408毫米波雷达数据解析学习记录-利用RVIZ实现解析结果的可视化

    前面已经基本完成了ARS 408毫米波雷达数据的获取与解析工作 虽然已经将从CAN口获取的数据解析处理成指定的消息类型并进行了发布 xff0c 但是需要注意的是 xff0c 它们只是处于文本数据形态 xff0c 我们仍然无法得到直观的显示结
  • ROS+D435i+YOLOv5+deepsort实现目标识别跟踪、测距、测速

    本来在linux下实现目标识别不麻烦 xff0c 麻烦的是当你只有一个深度摄像头且别的应用需要在ROS下执行并占用摄像头资源导致别的线程无法获得摄像头数据 反观使用深度摄像头能干很多事情 xff0c 测距 xff0c 测速 xff0c 坐标
  • 可视化图表API格式要求有哪些?Sugar BI详细代码示例(3)

    Sugar BI中的每个图表可以对应一个数据 API xff0c 用户浏览报表时 xff0c 选定一定的过滤条件 xff0c 点击 查询 按钮将会通过 API 拉取相应的数据 xff1b 前面说过 xff0c 为了确保用户数据的安全性 xf
  • 基于STM32F103与FreeRTOS的自平衡小车实现

    首先移植FreeRTOS到STM32F103上 xff0c 接着就是实现MPU6050的初始化 xff0c 这里移植了正点原子的参考例程 xff0c 基本实现是IIC初始化的 xff0c 读写IIC xff0c 接着就可以配置MPU6050
  • 第8次博文;如何将图片导入进pychrm中,我告诉你.

    在使用Pychrm中 xff0c 我们需要导入图片进入我们所在的文件夹中 但是不知道怎么做 xff0c 我教你 第一种方法 第1步 xff1a 我们需要找到我们将要放在文件夹的图片 第2步 xff1a 导入pychrm 步骤1 xff1b
  • 第10次博文:一招方法教你解决import requests 导入报错(出错)问题,秒解决!

    1 xff1a 主要情况说明在于自己在IDLE中 xff0c 导入import requests报错 xff0c 出现 name 34 requests 34 没有建立情况 xff1b 解决方法 xff1a 自己安装一个pychrm pyc
  • 第11次博文;有关下载XCOM串口助手链接

    访问CSDNUP主 xff0c 链接 xff1a 88条消息 XCOM V2 6串口助手 mshlc0728的博客 CSDN博客 免费即可下载 xff0c 本人只是引流
  • win11/win10+安装CH340+STM32,本人的做法可行哦

    本人安装CH340端口的过程 1 xff1b 首先下载含有CH340的文件 链接 xff1a https pan baidu com s 1Ml3RqgRq av9ruZ4QxOE0g 提取码 xff1a u0sv 2 xff1a 自己有S

随机推荐