数据结构 09 - 快速排序 && 归并排序

数据结构与算法之美 | 学习笔记09 ——归并排序&快速排序 归并排序和快速排序都用到了分治思想,的时间复杂度都为O(nlogn)O(nlogn)O(nlogn),适合大规模的数据排序。 一、归并排序(Merge Sort) 1. 归并排序实现 分治算法一般都是用递归来实现的,分治是解决问题的处理思想,递归是一种编程技巧。用递归来代码实现归并排序,首先写出递推公式的伪代码: 递推公式: merge_sort(p…r) = merge(merge_sort(p…q), merge_sort(q+1…r)) //下标p到r之间的数组排序,转化为p到q和q+1到r的数组排 阅读详情

一、快速排序

快速排序是对冒泡排序的一种改进
基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按照此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,最终使得整个数据变成有序序列。

在这里插入图片描述
代码实现:

public static void QuickSort1(int[] arr,int left,int right){
        int l = left;//左下标
        int r = right;//右下标

        //中轴值
        int pivot = arr[(left + right)/2];
        int temp = 0;
        //while循环的目的就是让比pivot小的值放到左边
        //比pivot大的值放到右边
        while (l < r){
            //在pivot的左边一直找,直到找到大于等于pivot的值,方退出
            while (arr[l] < pivot){
                l += 1;
            }
            //在pivot的右边一直找,直到找到小于等于pivot的值,方退出
            while (arr[r] > pivot){
                r -= 1;
            }
            //如果l>=r说明pivot的左右两边的值已经按照左边都是小于等于pivot值,右边全都是大于等于pivot的值
            if(l >= r){
                break;
            }
            //交换
            temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;
            //如果交换完后,发现这个arr[l] == pivot值相等,r--前移
            if(arr[l] == pivot){
                r -= 1;
            }
            //如果交换完后,发现这个arr[r] == pivot值相等,l--前移
            if(arr[r] == pivot){
                l += 1;
            }
        }
        //如果l == r,必须l++,r--,否则会出现栈溢出,陷入无限循环
        if(l == r){
            l++;
            r--;
        }
        //向左递归
        if(left < r){
            QuickSort1(arr,left,r);
        }
        //向右递归
        if(right > l){
            QuickSort1(arr,l,right);
        }
    }

二、归并排序
在这里插入图片描述
1.思路分析
(1).分开:采用递归
(2).合并
(2.1)依次比较左右两段有序序列的每个元素,将较小的值依次拷贝到temp数组中
(2.2)完成第一步后,有一边序列仍然有元素,此时按顺序将其拷贝到temp数组中
(2.3)将temp中的值赋给arr,不是全部赋值,而是特定段的值,即当前合并的这一段:left-right

代码实现:

public class mergessort {
    public static void main(String[] args) {
        int arr[] = {2,5,1,7,3,0,21,45};
        int temp[] = new int[arr.length];

        mergesort(arr,0,arr.length - 1,temp);
        System.out.println("归并排序后:" + Arrays.toString(arr));
    }
    //(一).分开
    public static void mergesort(int[] arr,int left,int right,int[] temp){
        int mid = (left + right)/2;
        if(left < right){
            //向左递归
            mergesort(arr,left,mid,temp);

            //向右递归
            mergesort(arr,mid + 1,right,temp);

            //合并
            merge(arr,left,mid,right,temp);
        }

    }

    //(二).合并
    public static void merge(int[] arr,int left,int mid,int right,int[] temp){
        int i = left;
        int j = mid + 1;
        int t = 0;

        //1.首先左右逐一比较,依次把小的值拷贝到temp中
        while (i <= mid && j <= right){
            if(arr[i] < arr[j]){
                temp[t] = arr[i];
                t += 1;
                i += 1;
            }else {
                temp[t] = arr[j];
                t += 1;
                j += 1;
            }
        }

        //2.进行完前面的比较后,会出现一边的有序序列还有元素,这时按顺序将其拷贝到temp中
        while (i <= mid){
            temp[t] = arr[i];
            t += 1;
            i += 1;
        }
        while (j <= right){
            temp[t] = arr[j];
            t += 1;
            j += 1;
        }

        //3.将temp的值赋给arr,不是全部赋值,而是特定段的值,即当前合并的这一段left-right
        t = 0;
        int temple = left;

        while (temple <= right){
            arr[temple] = temp[t];
            temple += 1;
            t += 1;
        }
    }
}
数据结构强化:算法题、应用题 408数据结构算法题41、应用题42. 阅读详情

相关推荐

SVG绘制圆环进度条

在我们的大屏可视化项目中,经常会用到各种各样的图表。与传统的表格展示、枯燥的文字阐述相比,图表展示则使用户看起来更加直观、数据的展示则更加一目了然。本文基于svg绘图技术结合前端技术栈vue,以工作中常用的环形进度条为例,简单阐述一下绘制进度条的一些思路。............

qq_40289557的博客 8361

数据结构学习——09—排序算法(快速排序、归并排序、常见排序算法比较)

一、快速排序(quick sort) 快速排序,又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 排序步骤为: 1、从数列中挑出一个元素,称为"基准"(pivot)(初始一般为第一...

weixin_42118531的博客 332

vuecli3 实现 移动端和pc端 界面切换(两套代码)

适合场景 多页面多系统应用 所有系统都在同一目录下。配置多入口多出口。每个系统之间可以链接。每个系统内依然采用Vue单页应用开发。 产品需求:一套代码 兼容pc端和移动端 , 移动端和pc端的样式布局差别很大,需要使用多界面,并判断使用手机的时候跳转移动端代码,使用pc端跳转pc端代码。 项目目录 分为两部分代码,pc 和mobile 第一步:创建一个登陆页面的文件 在项目public文件夹下创建一个login.html,其实就是将index.html复制一份,将title改一下: <!DOCTYP

你怎么也喜欢嘴巴嘟嘟 5921

数据结构快速排序与归并排序

1.快速排序 1.1快速排序法介绍 快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此 1559960171854.png 方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 1...

小武的Blog 266

【数据结构】面试题整理 共36题

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针。与数组不同,链表中的元素在内存中不必是连续存储的,这使得链表在插入和删除操作时非常高效。单向链表(Singly Linked List):每个节点只包含一个指向下一个节点的指针。双向链表(Doubly Linked List):每个节点包含两个指针,一个指向下一个节点,一个指向前一个节点。循环链表(Circular Linked List):链表的最后一个节点指向第一个节点,形成一个环。

weixin_44329069的博客 7200

Ollama模型路径迁移实战:Windows/Mac/Linux三系统保姆级教程(附常见问题排查)

本文提供了一份详细的Ollama模型路径迁移教程,涵盖Windows、macOS和Linux三大操作系统。针对默认安装路径占用系统盘空间的问题,文章指导用户如何安全移动模型文件、配置环境变量、重启服务,并附有迁移后的验证步骤与常见问题排查方法,帮助用户高效管理本地AI模型存储。

gray5的博客 543

数据结构-快速排序 归并排序

文章目录归并排序 (Merge sort)简介代码性能分析快速排序(Quick sort)简介代码性能分析总结 注:所有的代码在我的Github中有均具体C++代码实现。 这里主要讲的是时间复杂度为O(nlogn)的两种排序算法:快速排序(Qiuck sort)和 归并排序 (Merge sort)。 这两种排序都是用了分治的思想,我们因此可以借鉴这个思想来解决非排序的一些问题,例如:如何在O(n...

it-hao的博客 484

告别手动点鼠标:用Python脚本批量跑ADS版图仿真,效率提升10倍(附完整代码)

本文详细介绍了如何利用Python脚本自动化ADS版图仿真流程,显著提升射频工程师的工作效率。通过调用ADS底层接口,实现参数化修改、批量任务调度和结果自动收集,解决了手动操作中的常见问题,如仿真不更新等。附完整代码,帮助开发者快速实现10倍效率提升。

weixin_42523543的博客 332

数据结构----归并排序、快速排序

归并排序、快速排序一、归并排序1、规则2、代码3、时间复杂度、空间复杂度、稳定性二、快速排序1、规则2、代码3、时间复杂度、空间复杂度、稳定性三、总结 一、归并排序 1、规则 首先将所有的数据默认每个组,当所有的数 1、将所有数据单独给每个数据每个组(每个数据单独看,就是有序的) 原始数据:    84  9 18 19 48 12 90 84 90 12 第一次两两合并: 9  84 18 19 12 48 84 90 12 90 2、代码 3、时间复杂度、空间复杂度、稳定性 时间复杂度:O(n*l

li94263的博客 997

Logisim实战:手把手教你设计硬布线版MIPS CPU(多周期/8指令/附电路图)

本文是一份详细的Logisim实战指南,手把手教你设计一个采用硬布线控制的多周期MIPS CPU。文章深入剖析了硬布线控制与微程序控制的核心理念差异,并逐步讲解了从定义执行状态、构建状态跳转逻辑到生成控制信号、集成测试的完整流程,最终实现一个支持8条指令、可运行简单程序的处理器模型。

g9h0i1的博客 592

MIMO技术入门

MIMO:多天线技术,发射端和接收端有多个天线(注意:并不是指多个天线板,而是多套振子,每一套是一个独立的天线。) 4G:2、8天线 5G:4、64天线(64T64R) 手机也是多天线 MIMO实现效果的分类: 1)空间分集 。2)空间复用。3)波束赋形。 空间分集(space diversity) 作用:提升接收质量 利用多个天线发射或者接收一个数据流,避免单个信道衰落对整个链路的影响。(比如你的耳机坏了一只并不影响另一只) 空间复用(space multiplexing) 作用:提升速率 利

About1129的博客 2876

数据结构——快速排序与归并排序

快速排序 定义: 快速排序是由冒泡排序改进而得的。在冒泡排序过程中,只对相邻的两个记录进行比较,因此每次交换两个相邻记录时只能消除一个逆序。如果能通过两个不相邻记录的一次交换,消除多个逆序,则会大大加快排序的速度。快速排序方法中的一次交换能消除多个逆序。 具体步骤: 1.选择待排序表中的第一个记录作为枢轴,附设两个指针low和high,初始时分别指向标的下界和上界; 2.从标的最右侧位置一次向左搜索,找到第一个关键字小于枢轴关键字的记录,将其移至low处; 3.然后再从表的最左侧位置,依次向右搜索找到第一个

Dedication_的博客 434

西门子TP900精智系列触摸屏和三菱Q系列PLC以太网通信的组态步骤

西门子TP900精智系列触摸屏和三菱Q系列PLC以太网通信的组态步骤

Robot_PLC_HMI_Automation 6100

python归并排序函数详解_python 实现归并排序算法

python数据结构与算法总结python常用的数据结构与算法就分享到此处,本月涉及数据结构与算法的内容有如下文章:《数据结构和算法对python意味着什么?》《顺序表数据结构在python中的应用》《python实现单向链表数据结构及其基本方法》《python实现单向循环链表数据结构及其方法》《python实现双向...文章python之战2019-04-241168浏览量算法基础:五大排序算法...

weixin_39568926的博客 1042

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

09-排序1 排序

09-排序1 排序 来自:PTA_数据结构_排序1 排序 给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。 本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下: 数据1:只有1个元素; 数据2:11个不相同的整数,测试基本正确性; 数据3:10^3个随机整数; 数据4:10^4个随机整数; 数据5:10^5个随机整数; 数据6:10^5个顺序整数; 数据7:10^5个逆序整数; 数据8:10^5个基本有序的整数; 数据9:10^5个随机正整数,每个数字不超过1000。

王寒寒的博客 738

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)

文章目录前言一、希尔排序1.1 简单插入排序存在的问题1.2 基本介绍1.3 思路分析1.4 代码实现1.5 测试结果二、快速排序2.1 基本介绍2.2 思路分析2.3 代码实现2.4 测试结果三、归并排序3.1 基本介绍3.2 思路分析3.3 代码实现3.4 测试结果 前言 上节的三个排序算法:冒泡、选择、插入,较为简单,好理解,使用比较、交换的思想。但也都是基础。 这节的三个排序算法:希尔、...

冯安晨 955

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

黑马 Python数据结构与算法系列课程

目录: ┣━━1-01-算法引入.mp4 ┣━━1-05-代码执行时间测量模块timeit.mp4 ┣━━1-06-Python列表类型不同操作的时间效率.mp4 ┣━━1-04 常见时间复杂度与大小关系.mp4 ┣━━1-08-数据结构引入.mp4 ┣━━1-03 最坏时间复杂度与计算规则.mp4 ┣━━1-07-Python列表与字典操作的时间复杂度.mp4 ┣━━1-02-时间复杂度与...

weixin_46240963的博客 1122

数据结构和算法-09-排序

数据结构和算法-09-排序

北巷东东的专栏 920

快速排序-排序-数据结构和算法

关于快速排序的算法 性能和改进

gaogzhen的博客 403

【数据结构与算法-Day 40】深入理解分治算法:从归并排序到快速排序的思想基石

本文将系统地剖析分治思想的内涵、核心步骤、与递归的紧密关系,并通过具体案例和代码实战,带你领略“分而治之”的编程艺术。同时,我们还会探讨其经典应用(如归并排序、快速排序)及性能分析方法,帮助你从根本上掌握这一化繁为简的利器。

吴师兄大模型的博客 1402

《数据结构》09-排序1 排序

冒泡排序、插入排序、希尔排序、改进希尔排序、堆排序、递归归并排序、非递归归并排序、快速排序

叫我皮卡丘 3976

堆排序、快速排序、归并排序总结

二分查找及其扩展应用场景 大端和小端的问题 2012-09-21 11:33:41| 分类: 算法、数据结构 | 标签:算法数据结构 归并排序 内部排序 面试 |举报 |字号大中小订阅 这三个排序以前都写过,快速排序还写了递归版和迭代版。现在在这里做一下总结。 堆排序(Heap Sort) 堆排序是一种树形选择排...

weixin_30381317的博客 113

《数据结构(C语言版)》学习笔记09 排序

介绍常见的排序算法,包括直接插入排序、希尔(Shell)排序、冒泡排序、简单选择排序、快速排序、堆排序、归并排序。并提供相应的代码和执行效率分析,包含空间复杂度、时间复杂度、稳定性、适用性等。

梦想终会实现 881

插入排序 希尔排序 冒泡排序 归并排序 快速排序 选择排序 计数排序 堆排序[C++代码]

插入排序 希尔排序 冒泡排序 归并排序 快速排序 选择排序 计数排序[C++简洁代码实现]

weixin_44972997的博客 683

[数据结构]:16-归并排序(顺序表指针实现形式)(C语言实现)

此专栏包含408考研数据结构全部内容,除其中使用到C++引用外,全为C语言代码。使用C++引用主要是为了简化指针的使用,避免二重指针的出现。

Chandni_小月月 842

数据结构——排序算法总结(八个)

内排序:指在排序期间数据对象所有存放在内存的排序。外排序:指在排序期间所有对象太多,不能同一时候存放在内存中,必须依据排序过程的要求,不断在内,外存间移动的排序。

qq_34252068的博客 7956
上一篇: 数据结构 08 - 插入排序 && 希尔排序
下一篇: 数据结构 10 - 基数排序 && 堆排序
终难忘世外仙株寂寞林
博客等级 码龄6年 0粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值