经典算法之常用排序

news2024/12/30 3:15:45

在这里插入图片描述

目录

  • ❤️前言
  • 💘一、分治思想
  • 💞二、归并排序
    • 1.实现方法
    • 2.动图分析
    • 3.代码模板
  • 💖三、快速排序
    • 1.实现方法
    • 2.动图分析
    • 3.代码模板


❤️前言

本文介绍两种基于分治思想的经典排序算法: 归并排序快速排序


💘一、分治思想

分治思想,就是将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后在合并这些子问题的解来建立原问题的解。

从上面的解释中我们可以看出,分而治之的思维是靠递归来实现的,所以说,分而治之是一种思维,而递归就是具体的实现。
在这里插入图片描述

分而治之的实现具体有2个步骤:
1.找出基线条件,这种条件必须尽可能简单。
2. 不断将问题分解(或者说缩小规模),直到符合基线条件。


💞二、归并排序

1.实现方法

归并排序的核心思想是分治思想
分:将未排序的数组从中间分割成2部分,依次类推直至无法分割。
治:当无法再分割时,便可以对分区的元素进行两两合并
简而言之,就是左边排好序+右边排好序+归(合)并让整体有序
值得注意的是在对分区进行合并时,需要一个额外的辅助数组来暂存合并的结果,最后再复制到原数组中。
在这里插入图片描述

2.动图分析

在这里插入图片描述

3.代码模板

//合并函数
void merge(int arr[], int l, int mid, int r)
{
	int n = r - l + 1;
	//辅助数组
	int* help = (int*)malloc(n * sizeof(int));
	int index = 0;
	int p1 = l, p2 = mid + 1;
	while (p1 <= mid && p2 <= r) {
		if (arr[p1] <= arr[p2])
			help[index++] = arr[p1++];
		else
			help[index++] = arr[p2++];
	}
    while (p1 <= mid) {
        help[index++] = arr[p1++];
    }
    while (p2 <= r) {
        help[index++] = arr[p2++];
    }
    //复制到原数组
    for (int i = 0; i < n; i++) {
        arr[l + i] = help[i];
    }
}
//递归实现归并排序
void merge_sort(int arr[], int l, int r)
{
	if (l >= r)
		return;
	int mid = ( l + r  ) / 2;
	//排序左边
	merge_sort(arr, l, mid);
	//排序右边
	merge_sort(arr, mid + 1, r);
	//合并
	merge(arr, l, mid, r);
}

💖三、快速排序

1.实现方法

快速排序的核心思想同样也是分治思想
但是快速排序在分组的时候已经根据元素的大小来分组了,因此,合并时快速排序只需要把两个分组合并起来就可以了。而归并排序则需要对两个有序的数组根据大小进行合并。

快速排序的实现:
1、先调整区间,使小于等于基数x的在左边 ,大于等于基数x 的在右边。
2、递归处理基数x的左右段。

在这里插入图片描述

2.动图分析

在这里插入图片描述

3.代码模板

//递归实现快速排序
void quick_sort(int q[], int l, int r)
{
    if (l >= r) return;
    int i = l - 1, j = r + 1, x = q[l + r >> 1];
    while (i < j)
    {
        do i++; while (q[i] < x);
        do j--; while (q[j] > x);
        if (i < j)
        {
           //交换数据
            int tmp;
            tmp = q[i];
            q[i] = q[j];
            q[j] = tmp;
        }
    }
    //递归处理左右两段
    quick_sort(q, l, j), quick_sort(q, j + 1, r);
}

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

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

相关文章

【Python从入门到进阶】1、初识Python

一、Python的起源 1989年&#xff0c;为了打发圣诞节假期&#xff0c;荷兰程序员Gudio van Rossum吉多●范罗苏姆(龟叔&#xff0c;下图穿“人生苦短&#xff0c;我用Python”T恤衫的老哥)决心开发一个新的解释程序&#xff08;Python维形&#xff09;; 1991年&#xff0c;第一…

机器学习中的数学原理——向量内积

今天是2023年的第一天&#xff0c;祝大家新年快乐&#xff01;这个专栏主要是用来分享一下我在机器学习中的学习笔记及一些感悟&#xff0c;也希望对你的学习有帮助哦&#xff01;感兴趣的小伙伴欢迎私信或者评论区留言&#xff01;这一篇就更新一下《白话机器学习中的数学——…

【C语言】指针

文章目录指针作为参数的指针访问某个地址上的变量*指针的应用数组和指针数组变量是特殊的指针指针常量和常量指针数组指针和指针数组常见错误指针运算动态内存分配指针 一般用p来表示一个指针&#xff0c;来自pointer 一个指针类型的变量就是保存地址的变量。 变量的值是内存…

windows x32调用门实现 ring3提权

概述 调用门是Intel提供的一个机制&#xff0c;用于控制不同权限级(ring0-ring3)的程序函数调用。简单点就是提供了一个ring3 调用ring0 函数的机制。 在intel手册volume3-Chapter 5.83描述如下 Call gates facilitate controlled transfers of program control between dif…

算法笔记(25)win10系统安装tensorflow-GPU环境亲测好用

环境准备 首先你的电脑得有GPU显卡&#xff0c;然后在tensorflow官网&#xff08;在 Windows 环境中从源代码构建 | TensorFlow&#xff09;找到各安装软件对应的版本&#xff0c;版本不对应将会导致安装失败。 标本机GPU显卡版本题本文选择的是官网最新的组合&#xff1a;p…

cubeIDE开发, stm32窗口看门狗WWDG的CubeMX配置及HAL库底层实现分析

一、stm32的WWDG说明 1.1 WWDG特点&#xff1a; 在前一篇博文介绍独立看门狗时就指出STM32 MCU提供两个看门狗&#xff0c;独立看门狗和窗口看门狗。 cubeIDE开发&#xff0c; stm32独立看门狗IWDT的CubeMX配置及HAL库底层实现分析_py_free的博客-CSDN博客 相比独立看门狗&am…

【C语言】数据类型

文章目录c语言的类型整数整数类型整数的内部表达整数的范围unsigned整数的格式化浮点型浮点类型输入输出输出精度字符类型逃逸字符类型转换自动类型转换强制类型转换逻辑类型bool逻辑运算条件运算符C语言的变量&#xff0c;必须在使用前定义&#xff0c;并且确定类型&#xff1…

ubuntu下使用doxygen生成软件文档

ubuntu下使用Doxygen生成软件文档一、软件下载1.系统安装Doxygen2.Vscode插件安装二、软件配置三、文档生成1.方法1&#xff1a;使用Doxygen-gui生成&#xff08;推荐&#xff09;2.方法&#xff1a;采用Doxygen命令&#xff08;不推荐&#xff09;另外Windows下使用方法提示&a…

【JavaScript】 Date 日期对象概述及相关方法

文章目录【JavaScript】 Date 日期对象的创建及相关方法一. 日期对象的创建二. 日期对象的相关方法三. 时间戳案例案例1&#xff1a;在页面上展示一个时钟&#xff0c;隔1s更新一次案例2&#xff1a;距离除夕倒计时【JavaScript】 Date 日期对象的创建及相关方法 一. 日期对象…

ArcGIS基础:构建点对连线表达点集内部相互关系

原始数据如下&#xff0c;为普通的点图层&#xff0c;总共是21个点。 点位分布如下&#xff1a; 属性表打开如下&#xff1a; 下面使用【构造视线】工具进行操作&#xff0c;其工具位于【3D分析工具】下的【可见性】工具栏。 打开【构造视线】对话框&#xff0c;把【视点…

Leetcode【494. 目标和】

题目描述 给你一个整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘’ 或 ‘-’ &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 ‘’ &#xff0c;在 1 之前添加 ‘-’ &…

第10章 角色页的分页、排序、查询实现

1 重构WebApi.Controllers.RoleController. PostRolePageByFromBodyAsync //把所有符合条件的角色实例&#xff0c;按照指定字段进行排序操作。 if (!string.IsNullOrEmpty(pagination.OrderByFiled)) { var _obj JsonConvert.DeserializeAnonymousType(pagination.OrderByFil…

力扣 2351. 第一个出现两次的字母

题目 给你一个由小写英文字母组成的字符串 s &#xff0c;请你找出并返回第一个出现 两次 的字母。 注意&#xff1a; 如果 a 的 第二次 出现比 b 的 第二次 出现在字符串中的位置更靠前&#xff0c;则认为字母 a 在字母 b 之前出现两次。 s 包含至少一个出现两次的字母。 …

TopK问题的必会解法

目录经典解法&#xff0c;创建K个大小的堆不考虑空间的暴力排序做法不考虑空间的快排partition变形减治法思想(核心&#xff1a;找第K大的数)空间有限放不下&#xff0c;海量数据的分治法经典解法&#xff0c;创建K个大小的堆 传统的直接建立一个K个元素的小顶堆&#xff0c;类…

推荐两款可以将图片无损放大的在线工具

文章目录一、waifu2x网站预览传送地址二、BigJPG网站预览传送地址好不容易找到合适的图片素材但尺寸太小&#xff1f;那这里的工具正好适合你&#xff0c;能把你的小图放大几倍都不模糊。 一、waifu2x 本程序使用卷积神经网络对动漫风格的图片进行放大操作&#xff08;支持照…

再聊一下那 SQLSERVER 行不能跨页的事

一&#xff1a;背景 1. 讲故事 上一篇写完了之后&#xff0c;马上就有朋友留言对记录行的 8060byte 限制的疑惑&#xff0c;因为他的表记录存储了大量的文章&#xff0c;存储文章的字段类型用的是 nvarchar(max)&#xff0c;长度很显然是超过 8060byte 的&#xff0c;请问这个…

win10搭建 IIS 服务器

第一步: 打开程序和功能 找到 Internet 这个 勾选web管理工具和万维网服务 第二步: 在本地电脑创建一个文件夹(不要有中文空格等特殊字符) index.html 是默认访问的网址 第三步 关联访问的链接 选择本地物理路径 访问测试 第四步 修改绑定端口 第五步 修改防火墙 …

Linux | 文件操作的系统调用 open() read() write()

1. 基本含义辨析 文件操作的系统调用 open read write close &#xff08;系统调用&#xff1a;实现在内核中【用户态->内核态】—“陷入内核”&#xff09; man&#xff1a; 1 命令 2 系统调用 3 库函数 C操作文件的库函数 fopen fread fwrite fclose &#xff08;fo…

一个有意思的图片鼠标切换

做淘宝活动页面的时候&#xff0c;用到最多的就是锚点&#xff0c;一个图片标签&#xff0c;然后不断地在上面画热区。不过我想问的是有多少人研究过&#xff0c;用矩形画热点&#xff0c;四个坐标值各自表示的含义&#xff0c;还有它和background-position有什么相同或相似的地…

JavaWeb:RequestResponse的概述

1&#xff0c;Request和Response的概述 Request是请求对象&#xff0c;Response是响应对象。 这两个对象在我们使用Servlet的时候有看到&#xff1a; 此时&#xff0c;我们就需要思考一个问题request和response这两个参数的作用是什么&#xff1f; request&#xff1a;获取请…