快速排序与归并排序模板

快排

分治

核心是将一个复杂的问题分解为若干个规模较小的子问题,这些子问题相互独立且与原问题是同类的。将子问题逐个解决之后,再将子问题的解合并,从而得到原问题的解。

主要三个步骤:

  1. 分解:选择一个基准元素(pivot),然后将数组分割成两个子数组。其中一个子数组的所有元素都小于基准元素,另一个子数组的所有元素都大于基准元素。

  2. 递归:对两个子数组(小于基准元素的子数组和大于基准元素的子数组)进行递归快排,直到每个子数组的大小减少为 1 或 0,此时它们自然有序。

  3. 合并:当递归结束时,子数组都是有序的,所以整个数组就变为有序。

分区过程:

  1. 选择基准元素:第一个、最后一个、随机一个、中间的。

  2. 双指针扫描:使用两个指针,一个称为“左指针”或“较小元素指针”,另一个称为“右指针”或“较大元素指针”。左指针从数组的起始位置向右移动,寻找第一个大于等于基准元素的元素。右指针从数组的结束位置向左移动,寻找第一个小于等于基准元素的元素。当这两个指针相遇时,分区完成。此时,将左指针和右指针指向的元素进行交换。

  3. 确定基准元素的位置:分区结束后,将基准元素放在中间位置,使得左边的所有元素都小于等于基准元素,右边的所有元素都大于等于基准元素。

分区过程

数组 [6, 2, 5, 4, 3, 1, 2, 4],选择中间元素 5 作为基准元素。

  • 左指针从索引 0 开始,找到第一个大于等于 5 的元素,即 6
  • 右指针从索引 7 开始,找到第一个小于等于 5 的元素,即 4
  • 交换这两个元素,数组变为 [4, 2, 5, 4, 3, 1, 2, 6]
  • 继续移动指针,左指针找到下一个大于等于 5 的元素,右指针找到小的元素,直到左指针超过右指针,交换结束。

分区结果:

[4, 2, 3, 4, 1, 2, 5, 6]

现在,基准元素 5 处于正确的位置,左边的元素都小于等于它,右边的元素都大于等于它。

快排板子

#include <algorithm>
#include <iostream>
using namespace std;

void quickSort(int nums[], int l, int r) {
    if (l >= r) return;
    int i = l - 1, j = r + 1;
    int m = nums[(l + r) >> 1];
    while (i < j) {
        while (nums[++i] < m);
        while (nums[--j] > m);
        if (i < j) {
            swap(nums[i], nums[j]);
        }
    }
    quickSort(nums, l, j);
    quickSort(nums, j + 1, r);
}

int main() {
    int nums[] = {6, 2, 5, 4, 3, 1, 2, 4};
    int n = sizeof(nums) / sizeof(nums[0]);
    quickSort(nums, 0, n - 1);
    for (int i = 0; i < n; ++i) {
        cout << nums[i] << " ";
    }
    cout << endl;
    return 0;
}

归并

核心思想也是分治。不断地将数组分割成更小的部分,直到每个部分只有一个元素(此时它们自然有序),然后再将这些有序的小部分合并成一个有序的较大的部分,最终得到整个数组的有序排列。
快排是先分界再递归,归并是先递归完再分界。

归并板子

#include <iostream>
using namespace std;
int tmp[10000]; 

void merge_sort(int q[], int l, int r) {
    if (l >= r) return;
    int mid = l + r >> 1; 
    merge_sort(q, l, mid); 
    merge_sort(q, mid + 1, r); 

    int k = 0, i = l, j = mid + 1;
    while (i <= mid && j <= r)
        if (q[i] <= q[j]) tmp[k++] = q[i++];
        else tmp[k++] = q[j++];

    while (i <= mid) tmp[k++] = q[i++];
    while (j <= r) tmp[k++] = q[j++];

    for (i = l, j = 0; i <= r; i++, j++) q[i] = tmp[j];
}

int main() {
    int nums[] = {5, 3, 8, 6, 4, 1, 9, 7, 2};
    int n = sizeof(nums) / sizeof(nums[0]);
    merge_sort(nums, 0, n - 1);
    for (int i = 0; i < n; ++i) {
        cout << nums[i] << " ";
    }
    cout << endl;

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

unity学习59: 滑动条 和 滚动条 滚动区域

目录 1 滑动条 slider 1.1 创建slider 1.2 构成的子物体 1.2.1 找到 某个UI的 方法 1.3 构成的component&#xff0c;主体就是 slider 2 核心属性 2.1 value 2.2 direction 3 作用 3.1 由于是fill back 可以实现血条效果 3.2 可以取得 slider.value 数值 1 滑动条…

【问题记录】Go项目Docker中的consul访问主机8080端口被拒绝

【问题记录】Go项目Docker中的consul访问主机8080端口被拒绝 问题展示解决办法 问题展示 在使用docker中的consul服务的时候&#xff0c;通过命令行注册相应的服务&#xff08;比如cloudwego项目的demo_proto以及user服务&#xff09;失败。 解决办法 经过分析&#xff0c;是…

Hadoop第2课(伪分布式集群的搭建)

jdk和hadoop安装包&#xff1a; hadoop-2.9.2.t......等2个文件官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 1、用XFTP发送hadoop安装包和jdk到/home/hadoop/目录下&#xff08;hadoop用户的主目录&#xff09; 2、解压jdk安装包到~目录 卸载jdk的命令&#xff1a;r…

【前端基础】Day 3 CSS-2

目录 1. Emmet语法 1.1 快速生成HTML结构语法 1.2 快速生成CSS样式语法 2. CSS的复合选择器 2.1 后代选择器 2.2 子选择器 2.3 并集选择器 2.4 伪类选择器 2.4.1 链接伪类选择器 2.4.2 focus伪类选择器 2.5 复合选择器总结 3. CSS的元素显示模式 3.1 什么是元素显示…

微信小程序源码逆向 MacOS

前言 日常工作中经常会遇到对小程序的渗透测试&#xff0c;微信小程序的源码是保存在用户客户端本地&#xff0c;在渗透的过程中我们需要提取小程序的源码进行问题分析&#xff0c;本篇介绍如何在苹果电脑 MacOS 系统上提取微信小程序的源码。 0x01 微信小程序提取 在苹果电…

C语言入门资料分享源码+PDF速查手册

01 目标&#xff1a;掌握基础语法&#xff0c;能编写简单的程序 源码PDF获取 通过网盘分享的文件&#xff1a;C语言入门到精通.rar 链接: https://pan.baidu.com/s/1lcKj3aywRJUecLmoDeQfFg?pwdxiyx 提取码: xiyx 02 环境搭建 安装编译器&#xff08;推荐GCC/MinGW/M…

深入理解Java反射机制:从基础到高级应用

一、反射机制概述 Java 反射机制是 Java 语言的一个重要特性&#xff0c;它允许程序在运行时动态地获取类的信息&#xff0c;以及动态地调用对象的方法、修改属性等操作。这意味着程序员可以在运行期间检查和操作类、对象的各种元素&#xff0c;而不需要在编译时就知道这些信息…

[VMware]卸载VMware虚拟机和Linux系统ubuntu(自记录版)

记录一下,不是教程,只是防止我做错了可以回溯一下 我打开vscode,就会跳出下图 虚拟机,Linux还是很久之前学习安装的,种途可能卸载过(不太记得了),现在尝试彻底卸载 彻底卸载VMware虚拟机的详细步骤-CSDN博客虚拟机Vmware 转移 克隆 卸载及移除Linux系统_克隆的虚拟机怎么移除-…

server.servlet.session.timeout: 12h(HTTP 会话的超时时间为 12 小时)

从你提供的配置文件&#xff08;应该是 Spring Boot 的 application.yml 或 application.properties 文件&#xff09;来看&#xff0c;以下部分与会话超时时间相关&#xff1a; server:servlet:session:timeout: 12h # timeout: 30cookie:name: VENDER_SID会话超时时间的…

MS SQL Server partition by 函数实战二 编排考场人员

目录 需求 输出效果 范例运行环境 表及视图样本设计 功能实现 生成考场数据 生成重复的SQL语句 封装为统计视图 编写存储过程实现统计 小结 需求 假设有若干已分配准考证号的考生&#xff0c;准考证号示例&#xff08;01010001&#xff09;共计8位&#xff0c;前4位…

北京大学DeepSeek与AIGC应用(PDF无套路下载)

近年来&#xff0c;人工智能技术飞速发展&#xff0c;尤其是大模型和生成式AI&#xff08;AIGC&#xff09;的突破&#xff0c;正在重塑各行各业的生产方式与创新路径。 北京大学联合DeepSeek团队推出的内部研讨教程《DeepSeek与AIGC应用》&#xff0c;以通俗易懂的方式系统解…

DeepSeek-OpenSourceWeek-第三天-Release of DeepGEMM

DeepGEMM:这是一款专为高效的 FP8(8 位浮点)通用矩阵乘法(GEMMs)而开发的尖端库。GEMMs 是许多 AI 工作负载(尤其是深度学习)中的基本操作。 特点: 支持稠密和 MoE GEMMs:它可以处理标准的稠密矩阵乘法以及混合专家(MoE)模型中使用的矩阵乘法。MoE 是一种神经网络架…

鸿蒙兼容Mapbox地图应用测试

鸿蒙Next已经发布一段时间了&#xff0c;很多之前的移动端地图应用&#xff0c;纷纷都要求适配鸿蒙Next。作为开发者都清楚&#xff0c;所谓的适配其实都是重新开发&#xff0c;鸿蒙的开发语言和纯前端的Javascript不同&#xff0c;也可以Android原始开发的语言不同。鸿蒙自带的…

【机器学习】Logistic回归#1基于Scikit-Learn的简单Logistic回归

主要参考学习资料&#xff1a; 《机器学习算法的数学解析与Python实现》莫凡 著 前置知识&#xff1a;线性代数-Python 目录 问题背景数学模型类别表示Logistic函数假设函数损失函数训练步骤 代码实现特点 问题背景 分类问题是一类预测非连续&#xff08;离散&#xff09;值的…

STM32寄存器控制引脚高低电平

一. 引子 最近在学习32代码的过程当中&#xff0c;虽然在学习IMX6ULL开发板的过程中接触过很多寄存器&#xff0c;最近在返回去看32的时候&#xff0c;在研究代码的时候发现自己对于寄存器的有些特性理解的不够深刻&#xff0c;所以下来的时候去查了资料&#xff0c;以及问了一…

Python 爬虫与网络安全有什么关系

Python爬虫和网络安全之间存在密切的关系。爬虫是一种用于自动化从网络上获取信息的程序&#xff0c;而网络安全是保护计算机网络和系统免受未经授权的访问、攻击和数据泄露的实践。本文将探讨Python爬虫与网络安全之间的关系以及如何在爬虫开发中注意网络安全。 爬虫的作用和…

WiseFlow本地搭建实录---保姆教程

今天从零开始搭建了Wiseflow的本地环境搭建&#xff0c;目前使用的都是免费的API&#xff0c;我建议大家可以一起尝试一下搭建自己的关键信息的数据库&#xff0c;我是windows的环境&#xff0c;但是其他的应该也差不多&#xff0c;踩了很多坑&#xff0c;希望这篇文章能帮大家…

时间无关和时间相关的N-S方程

注意区分&#xff1a; 时间无关的情况&#xff08;稳态Navier-Stokes方程&#xff09;和时间相关的情况&#xff08;非定常Navier-Stokes方程&#xff09;。前者与时间无关&#xff0c;后者与事件有关。比如爆轰案例就是与时间相关的情况&#xff08;非定常Navier-Stokes方程&…

Vue 3 搭建前端模板并集成 Ant Design Vue(2025)

一、环境安装 截止2025.2.6 &#xff0c;官网发布的vue 3 稳定版本是 V 3.5.13 根据此时的官方文档要求&#xff0c;node 版本需要大于等于 V 18.3 于是使用 nvm 安装 v 20.18.0 二、创建项目 使用 Vue 官方推荐的脚手架 create-vue 快速创建 Vue3 的项目: 快速上手 | Vue.js…

SpringBoot接口自动化测试实战:从OpenAPI到压力测试全解析

引言&#xff1a;接口测试的必要性 在微服务架构盛行的今天&#xff0c;SpringBoot项目的接口质量直接影响着系统稳定性。本文将分享如何通过自动化工具链实现接口的功能验证与性能压测&#xff0c;使用OpenAPI规范打通测试全流程&#xff0c;让您的接口质量保障体系更加完备。…