【算法】分治法的应用——快速排序

news2025/1/11 3:50:53

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述


目录

  • 问题描述
  • 问题分析
  • 代码实现
  • 复杂性分析

问题描述

给定一个序列,对其按照大小递增或递减进行排序

问题分析

找到一个基准值x,将序列中小于x的元素放在左侧,将大于x的元素放在右侧,对左右两个子序列分别重复同样的操作,直至子序列的长度为1或0时结束

步骤如下:

  • 选择基准,一般选择第一个元素作为基准,或者随机选择

  • 将数组划分为两个部分,小于等于基准点的元素在左边,大于基准点的元素在右边

从数组的第二个元素开始遍历,如果当前元素小于基准,就交换它和第一个元素的位置。
这样,所有小于基准的元素都在基准的左边,所有大于基准的元素都在基准的右边。

  • 然后对左右两个部分分别进行递归排序

快速排序就是先将⼀个元素排好序,然后再将剩下的元素排好序

选择一个基准元素,将数组分成两部分,使得一部分的元素都比基准元素小,另一部分的元素都比基准元素大,然后对这两部分分别进行快速排序。

在这里插入图片描述

代码实现

#include <iostream>
using namespace std;

void QuickSort(int arr[], int left, int right)
{
	if (left >= right) {
		return;
	}
	int mark = arr[left];		//基准值
	int l = left;
	int r = right;
	int t = 0;
	while (l < r)
	{
		while (l < r && arr[r] >= mark) {//循环找到前序列大于基准的值
			r--;
		}
		while (l < r && arr[l] <= mark) {
			l++;
		}
		if (l < r) {
			t = arr[l]; arr[l] = arr[r]; arr[r] = t;
		}  
	}
	t = arr[l]; arr[l] = arr[left]; arr[left] = t;
	QuickSort(arr, left, l - 1);
	QuickSort(arr, l + 1, right);
}

int main()
{
	int arr[5] = { 3,6,5,1,8 };
	QuickSort(arr,0,4);
	for (int v : arr)
	{
		cout << v << "  ";
	}cout << endl;
	return 0;
}

在这里插入图片描述

这里介绍一下我看过的labuladong的算法笔记中的内容:

快速排序的基本框架:

void quicksort(int nums[], int lo, int hi) {
	 if (lo >= hi) {
	 return;
	 }
	 // 对 nums[lo..hi] 进⾏切分
	 // 使得 nums[lo..p-1] <= nums[p] < nums[p+1..hi]
	 int p = partition(nums, lo, hi);
	 // 去左右⼦数组进⾏切分
	 sort(nums, lo, p - 1);
	 sort(nums, p + 1, hi);
}

复杂性分析

  • 如果每次划分都产生两个n-11个元素的区间:

在这里插入图片描述

  • 如果每次划分所取的基准恰好为中值:

在这里插入图片描述

快速排序的时间复杂度在最坏情况下是O(n^2),但是在平均情况下,时间复杂度是O(n log n)

在这里插入图片描述

在数组中随机选出一个元素作为划分基准,这样可以使划分基准的选择是随机的,从而可以期望划分是较对称的


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

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

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

相关文章

30岁+文转码程序媛求职路复盘:也算是逆袭了!

这篇文章来自一位群友的分享&#xff1a; 这篇文章写于下班路上&#xff0c;刚刚入职不久&#xff0c;我想再冲刺一下大厂&#xff0c;阳哥建议我坚持总结打卡&#xff0c;可以尝试写写博客。 那我就从这篇开始吧&#xff0c;希望开个好头&#xff01; 上班的感觉真好 今天是…

bim与数字孪生智能建造的关系

随着建筑业数字化改革的推进&#xff0c;我们正迈入数字孪生时代&#xff0c;而真正实现建筑物数字孪生的智能建造&#xff0c;其基础前提是建造对象和建造过程的高度数字化&#xff0c;这样一个过程唯有依托BIM建立数据模型才能实现&#xff0c;真正达到智能建造或智慧运维。 …

内网穿透的应用-如何搭建WordPress博客网站,并且发布至公网上?

文章目录 如何搭建WordPress博客网站&#xff0c;并且发布至公网上&#xff1f;概述前置准备1 安装数据库管理工具1.1 安装图形图数据库管理工具&#xff0c;SQL_Front 2 创建一个新数据库2.1 创建数据库2.2 为数据库创建一个用户 3 安装PHP7.44. 创建一个新站点4.1 创建站点根…

CUDA小白 - NPP(6) 图像处理 Geometry Transforms (1)

cuda小白 原始API链接 NPP GPU架构近些年也有不少的变化&#xff0c;具体的可以参考别的博主的介绍&#xff0c;都比较详细。还有一些cuda中的专有名词的含义&#xff0c;可以参考《详解CUDA的Context、Stream、Warp、SM、SP、Kernel、Block、Grid》 常见的NppStatus&#xf…

Win11自带微软输入法怎么输入π及其他希腊字母

如果用搜狗等第三方输入法的话就没有这些问题了&#xff0c;各种符号很方便。 自带的输入法输入 pi 和 pai 都不能正常输入 π \pi π 参考文章 https://www.cnblogs.com/qq-757617012/p/14078133.html 如果用自带的输入法可以采用以下方式 输入uuxl xl表示“希腊”&#x…

最长回文子串(Longest Palindromic substring)

什么叫回文串 就是正读和反读都是一样的字符串&#xff0c;比如aba,abba,cdc像这样的字符串都是回文字符串 暴力破解法来查找最长的回文子串 这个图解的意思就是我们要拿到每一个右边的数&#xff0c;然后与左边的数一一匹配 下面看一下java的实现代码 package com.pxx;/*** …

详细解析如何用“双指针“解题(面试必备,小白一看就会系类)

一、前言 大家在平时的训练和交流中肯定多少都会听过或者见过用"双指针"去快速的解题&#xff0c;那么大家有没有想过&#xff0c;为什么要用"双指针"呢&#xff1f;这里的"双指针"和我们平时了解的指针一样吗&#xff1f; 其实&#xff0c;这里…

Python数据分析实战-表连接-merge四种连接方式用法(附源码和实现效果)

实现功能 表连接-merge四种连接方式用法&#xff0c; 将两个pandas表根据一个或者多个键&#xff08;列&#xff09;值进行连接。 实现代码 import pandas as pddf1 pd.DataFrame({key: [a, b, d],data1: range(3)}) print(df1)df2 pd.DataFrame({key: [a, b, c, a, b],dat…

电商商品的前后台类目设计思路,小本本记下来(提供获取京东淘宝商品类目信息API 免费测试)

今天&#xff0c;我们来聊聊商品类目的设计思路。 商品是电商的根基&#xff0c;核心目标是销&#xff0c;也就是卖货。卖货可以多层理解&#xff0c;卖给谁&#xff0c;怎么卖&#xff0c;什么货&#xff0c;其实就是人货场的概念。 我理解的货&#xff0c;不仅是商品层面&a…

使用python requests上传文件

import requests# 指定要上传的文件 files {file: (example.txt, open(1.py, rb))}# 发送POST请求上传文件 response requests.post(http://baidu.com, filesfiles, proxies{http: 127.0.0.1:8080})# 检查响应 if response.status_code 200:print(文件上传成功) else:print(…

连续相同idx 性能为4cycle、不同idx性能为2cycle

mem_bypass结合Tdm 技术&#xff08;通信技术知识积累&#xff1a;TDM - 知乎&#xff09;可以对ram的多拍连续访问。 mem_bypass技术的核心就是在下一次的读前&#xff0c;可以cover 上一次的写。 如下图所示&#xff08;读延时为3cycle&#xff09;&#xff1a; 时序1 &am…

ROS路由器环回脚本,实际在用,只需要更新一个IP地址

实际在用的脚本&#xff0c;需要ros版本较高&#xff0c;低版本可以照着自己改改用&#xff0c;亲测可以。 #取当前拨号ip地址 :global ednsiph [ /ip address get [/ip address find interface"pppoe-out1" ] address ] :global newip [:pick \$ednsiph 0 [:find \…

【chromium】windows 获取源码到本地

从github的chromium 镜像git clone 到2.5G失败了官方说不能,要去 windows_build_instructions vs2017和19都是32位的 vs2022是x64的 vs2022_install You may also have to set variable vs2022_install to your installation path of Visual Studio 2022,

移动中兴ZXHN F6610M光猫拨号密码查询

宽带到期&#xff0c;移动新换了个光猫&#xff0c;型号中兴ZXHN F6610M 光猫默认提供了user账号&#xff0c;但是这个账号基本只有查看权限。 超级账号CMCCAdmin aDm8H%MdA密码并不管用。 问装维&#xff0c;装维不给&#xff0c;曲线救国通过某二手平台查到了。 1.通过超密…

windows操作系统通过浏览器调用本地程序

通过浏览器调用本地程序通常被认为是危险的行为&#xff0c;是被禁止的&#xff0c;但在基于B/S架构的一体机项目中会用到关闭或重启操作系统的操作。此时需要在前端页面有相应的功能按钮并能实现相应的功能。 通过浏览器调用本地应用程序通常需要使用浏览器扩展或本地应用程序…

Transformer(二)—— ResNet(残差网络)

Transformer&#xff08;二&#xff09;—— ResNet&#xff08;残差网络&#xff09; 一、背景1.1 梯度消失/爆炸1.2 网络退化(Degradation) 二、思路2.1 为什么需要更深的网络2.2 理想中的深网络表现 三、实践和实验效果3.1 构造恒等映射&#xff1a;残差学习&#xff08;res…

AIRIOT训练营沈阳站圆满结束|手把手教你搞定物联网应用开发

8月28日-9月1日&#xff0c;由航天科技控股集团有限公司&#xff08;以下简称“航天科技”&#xff09;主办的《AIRIOT物联网平台应用与实战》训练营在沈阳圆满结束&#xff0c;来自上海电机学院、中渝软通信息技术、北京华天机电研究所、北京环卫集团、 中国恩菲 等多家企业…

easypoi模板导出、一张sheet有多个不同表格、带一张或多张echars图表

前言 昨天遇到个有点复杂的excel需要导出&#xff0c;一张sheet里面有两个不同的表格&#xff0c;然后还有几张echars图表要加进去。总共分为上下两个部分&#xff0c;上面是表格一&#xff1b;下面又分为左右两个部分&#xff0c;左边是表格二&#xff0c;右边是几张echars图…

过等保三级的好处是什么?谁能简单说说?

虽然国家已经严格落地执行了等保2.0政策&#xff0c;但还有少数小伙伴对于等保政策不是很了解&#xff0c;有小伙伴问过等保三级的好处是什么&#xff1f;谁能简单说说&#xff1f;这里就来一起聊聊。 过等保三级的好处是什么&#xff1f; 好处1、遵循国家法律法规要求&…

气象观测站:观测原理及优势,助力气象精准预报

随着全球气候变化日益严重&#xff0c;气象观测站在现代社会中的地位愈发凸显。 一、气象观测站的观测原理 气象观测站主要通过各种传感器来测量大气的温度、湿度、风速、风向、气压、太阳辐射等基本气象要素。这些传感器需要具备高精度和高稳定性&#xff0c;以确保观测数据…