【算法基础】基础算法之排序

news2024/11/15 18:46:49
😽 PREFACE
🎁欢迎各位→点赞👍 + 收藏⭐ + 评论📝
📢系列专栏: https://blog.csdn.net/weixin_59954106/category_12108349.html
💪 种一棵树最好是十年前其次是现在

目录

1.快排 

步骤

思路方法

题目1:快速排序

 参考代码

题目2:第k个数

 参考代码

快排的注意点

1.快排模板

2.快排总结

2.归并排序

步骤

思路方法

题目:归并排序

参考代码

归并模板


1.快排 

  • 步骤

1.确定分界点:分界点一般取左端点,右端点,中点或者随机点

2.调整区间:比如说分界点为x,把小于x分在左边区间,把大于x分在右边区间

3.递归处理左右两段

  • 思路方法

法一:
1.开两个数组:a[ ], b[ ].

2.扫描整个区间从最左端到最右端,如果比x小就放到a数组里面,比x大就放到b数组里面

3.之后再把a数组和b数组合并成一个数组

法二:

1.定义两个指针i,j

2.把i放在left处,j放在right处

3.如果i所在的位置小于x,此时i++,若大于x,i停下来,j所在的位置大于x,此时j--,若小于x,j停下来。最后再把i,j交换一下,接着如此循环下去

4.循环结束条件为i与j相遇或者错位为止

显然法二相较于法一更优,下面根据例题来进行法二的代码实现:

  • 题目1:快速排序

  •  参考代码

#include <iostream>
using namespace std;
const int N = 1e6 + 10;

int n;
int q[N];

void quick_sort(int q[], int l, int r)
{
	if (l >= r)
	{
		return;
	}
	int x = q[l], i = l - 1, j = r + 1;
	while (i < j)
	{
		do
		{
			i++;
		} while (q[i] < x);
		do
		{
			j--;
		} while (q[j] > x);
		if (i < j)
			swap(q[i], q[j]);
	}
	quick_sort(q, l, j);
	quick_sort(q, j + 1, r);
}

int main()
{
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &q[i]);
	}
	quick_sort(q, 0, n - 1);
	for (int i = 0; i < n; i++)
	{
		printf("%d ", q[i]);
	}
	return 0;
}

快排题目代码人工动态展示过程:

RPReplay_Final1674209649(1)

  • 题目2:第k个数

 参考代码

#include <iostream>
using namespace std;
const int N = 1e6 + 10;

int n,k;
int q[N];

void quick_sort(int q[], int l, int r)
{
	if (l >= r)
	{
		return;//边界
	}
	int x = q[l+r>>1], i = l - 1, j = r + 1;
	while (i < j)
	{
		do
		{
			i++;
		} while (q[i] < x);
		do
		{
			j--;
		} while (q[j] > x);
		if (i < j)
			swap(q[i], q[j]);
	}
	quick_sort(q, l, j);
	quick_sort(q, j + 1, r);
}

int main()
{
	scanf("%d %d", &n,&k);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &q[i]);
	}
	quick_sort(q, 0, n - 1);
	for (int i = 0; i < n; i++)
	{
		if (i + 1 == k)
			printf("%d\n", q[i]);
	}
	return 0;
}

快排的注意点

1.快排模板

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) swap(q[i], q[j]);
    }

    //第二步:递归处理子问题
    quick_sort(q, l, j), quick_sort(q, j + 1, r);

    //第三步:子问题合并.快排这一步不需要操作,但归并排序的核心在这一步骤
}

2.快排总结

2.归并排序

  • 步骤

1.确定分界点mid=(left+right)/2

2.递归排序left,right

3.归并(合二为一) 

关于归并排序的时间复杂度

  • 思路方法

1.有数组 q, 左端点 l, 右端点 r

2.确定划分边界 mid=(left+right)/2

3.递归处理子问题 q[l..mid], q[mid+1..r]

4.合并子问题

  • 主体并:至少有一个小数组添合加到新数组中
  • 收尾:可能存在的剩下的一个小数组的尾部直接添加到新数组中

  • 复制回来:新数组覆盖原数组

  • 题目:归并排序

  • 参考代码

#include <iostream>
using namespace std;
const int N = 1e6 + 10;

int n;
int q[N], tmp[N];

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()
{
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &q[i]);
	}
	merge_sort(q, 0, n - 1);
	for (int i = 0; i < n; i++)
	{
		printf("%d ", q[i]);
	}
	return 0;
}
  • 归并模板

归并属于分治算法,有三个步骤:

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, tmp[r - l + 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(k = 0, i = l; i <= r; k++, i++) q[i] = tmp[k];
}

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

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

相关文章

ABB机器人仿真软件robotstudio v6.08安装教程

ABB机器人仿真软件robotstudio v6.08安装教程 具体步骤可参考以下内容: 注意:安装之前,最好将电脑的名称改为英文,否则可能会安装不成功, 第1步:将下载的安装包解压缩, 第2步:找到解压后的文件中的RobotStudio6.08, 第3步:找到“setup.exe”, 第4步:软件正在…

Open3D 深度图像转点云数据(Python版本)

文章目录 一、简介二、代码实现三、实现效果测试数据参考文献一、简介 深度图像的获取有很多方式,如激光雷达、结构光以及深度相机等,网上很多教程都是在讲解通过深度相机所获取的深度图像转换为三维点云数据(相机内参、外参),但是通过激光雷达所生成的深度相机通常与相机…

数据分析-决策树

我们生活中遇到很多问题其实把他们抽象成一个数学模型&#xff0c;都可以抽象为一个决策树。&#xff08;比如打篮球&#xff09; 我们总是会经历两个阶段&#xff1a;构造、剪枝 构造 什么是构造呢&#xff1f;构造就是生成一棵完整的决策树。简单来说&#xff0c;构造的过程…

【MySQL基础】MySQL多表操作详解

序号系列文章4【MySQL基础】MySQL表的七大约束5【MySQL基础】字符集与校对集详解6【MySQL基础】MySQL单表操作详解7【MySQL基础】运算符及相关函数详解文章目录前言MySQL多表操作1&#xff0c;多表关系1.1&#xff0c;一对一1.2&#xff0c;一对多1.3&#xff0c;多对多2&#…

Prometheus 配置身份认证

Prometheus 版本 2.41.0 平台统一监控的介绍和调研直观感受PromQL及其数据类型PromQL之选择器和运算符PromQL之函数Prometheus 配置身份认证 Prometheus 使用默认方式安装是不带有身份证认证和TLS&#xff0c;需要单独配置开启。 Prometheus 配置文件为yaml格式&#xff0c;并…

【自然语言处理】文本表示(一):One-Hot、BOW、TF-IDF、N-Gram

文本表示&#xff08;一&#xff09;&#xff1a;One-Hot、BOW、TF-IDF、N-Gram1.One-Hot 编码 One-Hot 编码&#xff0c;又称 “独热编码”&#xff0c;是比较常用的文本特征提取方法。这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小&#xff0c;只有一个维…

4. 基础语法

1. 标识符 a. 第一个字符必须是字母表中字母或下划线 _&#xff1b; b. 标识符的其他的部分由字母、数字和下划线组成&#xff1b; c. 标识符对大小写敏感&#xff1b; 在 Python 3 中&#xff0c;可以用中文作为变量名&#xff0c;非 ASCII 标识符也是允许的&#xff1b; 2.…

【JavaGuide面试总结】计算机网络·中

【JavaGuide面试总结】计算机网络中1.说说断开连接 - TCP 四次挥手2.为什么要四次挥手&#xff1f;3.为什么不能把服务器发送的 ACK 和 FIN 合并起来&#xff0c;变成三次挥手&#xff1f;4.如果第二次挥手时服务器的 ACK 没有送达客户端&#xff0c;会怎样&#xff1f;5.为什么…

第五届字节跳动青训营 前端进阶学习笔记(五)CSS进阶

文章目录前言CSS的重要特性1.选择器特指度&#xff08;1&#xff09;选择器优先级&#xff08;2&#xff09;选择器特指度2.继承&#xff08;1&#xff09;默认继承&#xff08;2&#xff09;显式继承3.初始值4.CSS属性值的计算过程布局&#xff08;Layout&#xff09;1.布局相…

搜索?——P3956 [NOIP2017 普及组] 棋盘

传送门: [NOIP2017 普及组] 棋盘 - 洛谷 思路: 将棋盘的每一个格子看做一个点&#xff0c;建一个无向图用来跑最短路. 这道题本应用搜索来做&#xff0c;但是转换成最短路好像简单点 建图: 1.对于已经有颜色的格子&#xff0c;在扫描四个方向的格子对相同颜色的建条长度为0…

【目标检测】目标检测究竟发展到了什么程度?聊聊这22年!

目录&#xff1a;目标检测的发展历程一、引言二、背景三、目标检测发展脉络3.1 传统目标检测算法3.1.1 Viola Jones Detector3.1.2 HOG Detector3.1.3 DPM Detector3.1.4 局限性3.2 Anchor-Based中的Two-stage目标检测算法3.2.1 RCNN3.2.2 SPPNet3.2.3 Fast RCNN3.2.4 Faster R…

Allegro如何设置Net Group操作指导

Allegro如何设置Net Group操作指导 Allegro除了可以对一组网络设置Bus以外,同样支持创建Net Group,如下图 功能和Bus的功能类似,并且同一个Net Group里面的网络可以形成一个shape形式的Group,方便查看 具体创建方法操作如下 打开规则管理器选择Electrical

MySQL窗口函教-开窗聚合函数(SUM()、AVG()、MAX()、MIN()、COUNT())

MySQL窗口函教-开窗聚合函数&#xff08;SUM()、AVG()、MAX()、MIN()、COUNT()&#xff09;和传统的聚合函数区别&#xff1f;最大的区别在于&#xff0c;一个操作列&#xff0c;一个是依次操作行&#xff0c;最终显示出每一行&#xff0c;最后的效果就是呈现叠加的效果-- 开窗…

Windows环境下安装配置Mosquitto服务及入门操作介绍

文章目录一、概念梳理二、下载与安装三、关于配置文件的一些重要说明四、配置登录账号和密码参考&#xff1a; 博客一、概念梳理 Mosquitto是一款实现了消息推送协议MQTT 3.1的开源消息代理软件&#xff0c;提供轻量级的、支持可订阅/可发布的消息推送模式&#xff0c;是设备与…

mf10ccwm芯片说明部分译文

MF10-N是一种通用的双二阶状态变量滤波器&#xff0c;其中心频率与应用于时钟输入&#xff08;fCLK&#xff09;的方波的频率成正比。通过将引脚12连接到适当的直流电压&#xff0c;滤波器中心频率fO可以等于fCLK/100或fCLK/50。通过使用晶体时钟振荡器可以非常精确地设置&…

《深入浅出计算机组成原理》学习笔记 Day5

动态链接1. 静态链接与动态链接2. 地址无关3. PLT 和 GOT参考1. 静态链接与动态链接 静态链接&#xff08;Static Link&#xff09;是通过合并代码段的方法来使程序装载至内存&#xff1b; 动态链接&#xff08;Dynamic Link&#xff09;则是链接加载到内存中的共享库&#xf…

数据结构之栈与队列详解

文章目录前言一、栈1.栈的概念及定义2.栈的实现&#xff08;1&#xff09;栈的结构&#xff08;2&#xff09;StackInit&#xff08;初始化&#xff09;&#xff08;3&#xff09;StackPush&#xff08;压栈&#xff09;&#xff08;4&#xff09;StackPop&#xff08;出栈&…

与众不同的异域年夜饭体验,你最中意哪一款?

年夜饭&#xff0c;中国人一年中最重要的一顿团圆聚餐&#xff0c;不仅丰富多彩&#xff0c;还充满了各种吉祥寓意。如果你选择的是出境旅游过春节&#xff0c;那么一次异域年夜饭体验也可以让你的旅行充满乐趣&#xff0c;收获与众不同的别样回忆。今天就跟着小旅城去看看&…

1597_AURIX_TC275_GPIO简介

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 左上角画出来的这个寄存器可以进行输入输出的控制。从右边上下拉设备这里可以看得出来&#xff0c;输入输出其实都是可以配置的。当端口配置为输入的时候&#xff0c;逻辑图中的输出驱动会…

使用文本编辑器编写Java源代码

使用文本编辑器编写Java源代码 编写JavaJavaJava应用程序&#xff0c;可以使用任何一个文本编辑器来编写程序的源代码&#xff0c;然后使用JDKJDKJDK搭配的工具进行编译和运行&#xff0c;在这里&#xff0c;我将介绍一个使用简单的文本编辑器来开发一个JavaJavaJava应用程序的…