算法学习系列(七):快速排序、归并排序

目录

  • 引言
  • 一、快速排序
    • 1.模板一
    • 2.模板二
  • 二、归并排序
    • 1.模板一
  • 三、例题扩展
    • 1.第k个数
    • 2.逆序对的个数

引言

对于快排和归并排序这个相信大家都知道,是非常重要的,不论是在找工作、考研、竞赛,这两个排序可以说是非常的重要,在面试中,面试官非常有可能就是让你手撕快排或者是归排,然后竞赛也有很多关于快排和归排的应用,等下会列出来一些具体的问题,然后接下来就开始吧。其实关于这个东西,我还是想说,其实这些背背看看就行了,但是真正有价值的是得多练多思考,多动。

一、快速排序

这个快排的思想说一下:就是每次找一个数排序,使得这个数的左边全部都小于该数,这个数的右边全都大于该数,然后再递归左半边,递归右半边。

1.模板一

这个有个注意的问题,就是这个模板的边界条件,x不能取q[r],否则会有边界问题出现

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];  //q[l] 或任意 但不能是q[r]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.模板二

这个模板是先把x取出来,然后从j开始遍历,j不满足就把j的值给i,然后i继续遍历,i不满足就把i的值给j,最后把x的值给i或者j

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

二、归并排序

这个归并排序跟快排不同的是,快排是先排好后再分治,而归并排序是,先分治,然后到达分界条件后再递推上去排序,大概下图中的这么个方式
在这里插入图片描述

1.模板一

很惭愧,这个只有一个模板,因为这个不是很难,边界问题也没有,所以只有一个标准版的模板

void merge_sort(int a[], int l, int r)
{if(l >= r) return;int mid = l + r >> 1;merge_sort(a, l, mid), merge_sort(a, mid + 1, r);int i = l, j = mid + 1, k = 0;while(i <= mid && j <= r){if(a[i] < a[j]) tmp[k++] = a[i++];else tmp[k++] = a[j++];}while(i <= mid) tmp[k++] = a[i++];while(j <= r) tmp[k++] = a[j++];for(int i = l, j = 0; j < k; ++i, ++j) a[i] = tmp[j];
}

三、例题扩展

1.第k个数

给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。输入格式
第一行包含两个整数 n 和 k。第二行包含 n 个整数(所有整数均在 1109 范围内),表示整数数列。输出格式
输出一个整数,表示数列的第 k 小数。数据范围
1≤n≤100000,1≤k≤n输入样例:
5 3
2 4 1 5 3
输出样例:
3
#include <cstdio>
#include <iostream>using namespace std;const int N = 1e6+10;int a[N];
int n, k;int quick_sort(int q[], int l, int r, int k)
{if(l >= r) return q[l];int i = l - 1, j = r + 1, x = q[l + r >> 1];  //q[l] 或任意 但不能是q[r]while(i < j){do i++; while(q[i] < x);do j--; while(q[j] > x);if(i < j) swap(q[i], q[j]);}if(j - l + 1 >= k) return quick_sort(q, l, j, k);else return quick_sort(q, j + 1, r, k - (j - l + 1));
}int main()
{cin >> n >> k;for(int i = 0; i < n; ++i) scanf("%d",&a[i]);cout << quick_sort(a, 0, n-1,k);return 0;
}

2.逆序对的个数

给定一个长度为 n的整数数列,请你计算数列中的逆序对的数量。逆序对的定义如下:对于数列的第 i个和第 j个元素,如果满足 i<j且 a[i]>a[j],则其为一个逆序对;否则不是。输入格式
第一行包含整数 n,表示数列的长度。第二行包含 n个整数,表示整个数列。输出格式
输出一个整数,表示逆序对的个数。数据范围
1≤n≤100000,数列中的元素的取值范围 [1,109]。输入样例:
6
2 3 4 5 6 1
输出样例:
5
#include <cstdio>
#include <iostream>using namespace std;typedef long long LL;const int N = 1e5+10;int a[N], tmp[N];
int n;LL merge_sort(int a[], int l, int r)
{if(l >= r) return 0;int mid = l + r >> 1;LL res = 0;res += merge_sort(a, l, mid) + merge_sort(a, mid + 1, r);int i = l, j = mid + 1, k = 0;while(i <= mid && j <= r){if(a[i] <= a[j]) tmp[k++] = a[i++];else {tmp[k++] = a[j++];res += mid - i + 1;}}while(i <= mid) tmp[k++] = a[i++];while(j <= r) tmp[k++] = a[j++];for(int i = l, j = 0; i <= r; ++i, ++j) a[i] = tmp[j];return res;
}int main()
{scanf("%d", &n);for(int i = 0; i < n; ++i) scanf("%d", &a[i]);cout << merge_sort(a, 0, n-1) << endl;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在线工具分享SQL转ElasticSearchDSL语句

&#x1f60a; 作者&#xff1a; 瓶盖子io &#x1f496; 主页&#xff1a; 瓶盖子io-CSDN博客

Go实现http同步文件操作 - 增删改查

http同步文件操作 - 增删改查 http同步文件操作 - 增删改查1. 前置要求1.1. 构建结构体 文件名 文件内容1.1.1. 页面结构体1.1.2. 为Page结构体绑定方法&#xff1a;Save1.1.3. 对Page结构体支持页面内容查看方法&#xff0c;同时提供页面文件是否存在的方法 1.2. 简单验证上面…

【思路代码详解】2023mathorcup大数据复赛B题妈妈杯高校数学建模挑战赛电商零售商家需求预测及库存优化问题

2023 年 MathorCup 高校数学建模挑战赛——大数据竞赛 赛道 B复赛&#xff1a;电商零售商家需求预测及库存优化问题 问题一 目标&#xff1a;制定补货计划&#xff0c;基于预测销量。 背景&#xff1a;固定库存盘点周期NRT1, 提前期LT3天。 初始条件&#xff1a;所有商品…

在线教育小程序如何一键生成App

在线教育行业是指通过互联网平台提供的各种教育和培训服务。这不仅包括传统的课程学习&#xff0c;还涵盖了一系列创新的学习模式。例如&#xff0c;同步在线课程允许学生和教师在同一时间在线&#xff0c;通过实时的视频和聊天工具进行互动。而异步在线课程则为学生提供了更大…

nodejs流

什么是流 stream 流是用于在 Node.js 中处理流数据的抽象接口。 node:stream 模块提供了用于实现流接口的 API。 什么是流数据 流数据是指一组顺序、大量、快速、连续到达的数据序列&#xff0c;一般情况下数据流可被视为一个随时间延续而无限增长的动态数据集合。流数据应用…

外包实在是太坑了,划水三年,感觉人都废了

先说一下自己的情况&#xff0c;专科生&#xff0c;19年通过校招进入杭州某个外包软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了3年的功…

Python绘制几种常见的时序分析图

时间序列数据是一种按照时间顺序排列的观测值集合&#xff0c;每个观测值对应于一个特定的时间点。这种数据在许多领域中都具有重要的应用价值&#xff0c;如金融、经济、气候科学等。通过分析时间序列数据&#xff0c;可以帮助我们掌握潜在的模式、发现趋势和季节性波动等重要…

数据可视化在电商中的威力:改变经营的新趋势

随着电商行业的迅速发展&#xff0c;数据可视化在电商经营中扮演着越来越重要的角色。我接手的许多可视化大屏设计工作都来自于各类电商店铺&#xff0c;今天让我们一起来看看数据可视化是如何改变电商经营的。 首先&#xff0c;通过数据可视化可以更好地洞察消费者行为。通过…

网络编程基础api

1. IP 协议 1.1 IP 分片 &#xff08;1&#xff09;IP 分片和重组主要依靠 IP 头部三个字段&#xff1a;数据报标识、标志和片偏移 以太网帧的 MTU 是 1500 字节&#xff1b; 一个每个分片都有自己的 IP 头部&#xff0c;它们都具有相同的标识值&#xff0c;有不同的片偏移…

Python与ArcGIS系列(十六)重复节点检测

目录 0 简述1 实例需求2 arcpy开发脚本0 简述 在处理gis线图层和面图层数据时,有时候会遇到这种情况:数据存在重复节点或伪重复节点(两个节点距离极小),往往我们需要对这种数据进行检测标注或进行修改。本篇将介绍如何利用arcpy及arcgis的工具箱实现这个功能。 1 实例需求…

Java-网络通信总结

文章目录 网络程序设计基础局域网与互联网 网络协议IP协议TCP/IP 协议端口域套接字 TCP 程序InterAddress 类ServerSocket 类 UDP 程序DatagramPacket 类DatagramSocket 类 网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。Java 已经将网络程序所需要的元素…

maven工程的pom.xml文件中增加了依赖,但偶尔没有下载到本地仓库

maven工程pom.xml文件中的个别依赖没有下载到本地maven仓库。以前没有遇到这种情况&#xff0c;今天就遇到了这个问题&#xff0c;把解决过程记录下来。 我在eclipse中编辑maven工程的pom.xml文件&#xff0c;增加对mybatis的依赖&#xff0c;但保存文件后&#xff0c;依赖的j…