排序算法(2)

文章目录

  • 概要
  • 原理及实现
    • 归并排序
      • 定义
      • 性能
      • 代码Python
    • 快速排序
      • 定义
      • 代码
  • 小结

概要

接上回

在上篇说过经典的排序算法,有冒泡,插入,选择;归并,快排。其中讲了冒泡,插入,选择;这一回写归并和快排。

原理及实现

原理是很好玩的,如果不喜欢,先记住,总有一天会用得上的。

原理挺有意思的,喜欢就去研究,不喜欢就记住一些常用的,以备不时之需。先聊聊归并吧。

归并排序

本来想找个定义,看了下维基百科,也不是很满意的概念,如下:

定义

归并排序(英语:Merge sort,或mergesort),是建立在归并操作上的一种有效的排序算法,效率为𝑂(𝑛log𝑛)(大O符号)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。
定义是这样的,怎么理解呢?采用分治递归,意思就是先平均分成2份,然后比较排序;递归这种操作,就是将2份中任何一份继续采用分治法(分治法这里不细聊,以后会写文章的),分成2份,直到不能再分为止;

性能

  1. 归并排序是稳定的排序算法;数组长度就那么长,一直在分割,然后继续分割直到不能再分,然后采用合并数组;
  2. 时间复杂度:O(nlogn)
  3. 空间复杂度:O(nlogn)

代码Python

dfrom typing import Listdef merge_sort(a: List[int]):merge_sort_between(a, 0, len(a) - 1)def merge_sort_between(a: List[int], low: int, high: int):# The indices are inclusive for both low and high.if low < high:mid = low + (high - low) // 2merge_sort_between(a, low, mid)merge_sort_between(a, mid + 1, high)merge(a, low, mid, high)def merge(a: List[int], low: int, mid: int, high: int):# a[low:mid], a[mid+1, high] are sorted.i, j = low, mid + 1tmp = []while i <= mid and j <= high:if a[i] <= a[j]:tmp.append(a[i])i += 1else:tmp.append(a[j])j += 1start = i if i <= mid else jend = mid if i <= mid else hightmp.extend(a[start:end + 1])a[low:high + 1] = tmp

快速排序

归并说完了,来看看快排。定义如下:

定义

快速排序(英语:Quicksort),又称分区交换排序(partition-exchange sort),是一种排序算法,最早由东尼·霍尔提出。在平均状况下,排序𝑛个项目要𝑂(𝑛log𝑛)(大O符号)次比较。在最坏状况下则需要𝑂( n 2 n^2 n2)次比较,但这种状况并不常见。事实上,快速排序Θ(𝑛log𝑛)通常明显比其他算法更快,因为它的内部循环可以在大部分的架构上很有效率地达成。
按照定义,对一定长度的数据,选一个基准值,然后所有数据一个一个跟基准值比较,然后交互i,j的位置。还是分治和递归的思想,一直这么分,partion。
接下来看看代码,如下:

代码

from typing import List
import randomdef quick_sort(a: List[int]):quick_sort_between(a, 0, len(a) - 1)def quick_sort_between(a: List[int], low: int, high: int):if low < high:# get a random position as the pivotk = random.randint(low, high)a[low], a[k] = a[k], a[low]m = partition(a, low, high)  # a[m] is in final positionquick_sort_between(a, low, m - 1)quick_sort_between(a, m + 1, high)def partition(a: List[int], low: int, high: int):pivot, j = a[low], lowfor i in range(low + 1, high + 1):if a[i] <= pivot:j += 1a[j], a[i] = a[i], a[j]  # swapa[low], a[j] = a[j], a[low]return j

小结

学习总结

归并,排序都采用了分治的思想。时间复杂度归并O(nlogn),空间复杂度归并的比较大,达到O(n);快排时间复杂度O(nlogn),快排极端情况达到O( n 2 n^2 n2),但是概率很小,而且可以通过合理的选用基准值来避免,适用范围较广。

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

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

相关文章

某招聘网站搜索结果接口逆向之webpack扣取

逆向网址 aHR0cHM6Ly93ZS41MWpvYi5jb20v 逆向链接 aHR0cHM6Ly93ZS41MWpvYi5jb20vcGMvc2VhcmNoP2pvYkFyZWE9MDAwMDAwJmtleXdvcmQ9cGhwJnNlYXJjaFR5cGU9MiZrZXl3b3JkVHlwZT0 逆向接口 aHR0cHM6Ly93ZS41MWpvYi5jb20vYXBpL2pvYi9zZWFyY2gtcGM 逆向过程 请求方式 POST 逆向参数 …

华为Pura70发布,供应链公司进入静默保密期

保密措施&#xff1a;与华为Pura70发布相关的供应链公司在产品发布前后处于静默保密期。这可能是由于华为对于手机供应链的一些信息处于保密状态&#xff0c;尤其是关于麒麟芯片的代工厂商等敏感信息。这种保密措施有助于保持产品的神秘感&#xff0c;调动用户的好奇心&#xf…

微信小程序+esp8266温湿度读取

本文主要使用微信小程序显示ESP8266读取的温湿度并通过微信小程序控制LED灯。小程序界面如下图所示 原理讲解 esp8266 通过mqtt发布消息,微信小程序通过mqtt 订阅消息,小程序订阅后,就可以实时收到esp8266 传输来的消息。 个人可免费注册五个微信小程序账号,在微信小程序官…

开源框架 NanUI 项目宣布将暂停开发,作者转行卖钢材

NanUI 界面组件是一个开源的 .NET 窗体应用程序界面框架&#xff0c;适用于希望使用 HTML5 / CSS3 等前端技术来构建 Windows 窗体应用程序用户界面的 .NET 开发人员。 该项目的作者林选臣日前在 GitHub 上发布了停更公告&#xff0c;称因去年被裁员失业&#xff0c;他目前已经…

Adobe软件全家桶:从平面到视频再到音频的创意之旅

在创意设计的广阔天地里&#xff0c;Adobe公司旗下的系列软件无疑是设计师们手中的魔法棒&#xff0c;它们串联起平面设计、视频剪辑直至音频处理的每一个环节&#xff0c;成为跨越视觉创意门槛的必备工具集。本文将深入浅出地介绍这些软件的应用场景、特色功能及其相互间的协作…

Redis 实战1

SDS Redis 只会使用 C 字符串作为字面量&#xff0c; 在大多数情况下&#xff0c; Redis 使用 SDS &#xff08;Simple Dynamic String&#xff0c;简单动态字符串&#xff09;作为字符串表示。 比起 C 字符串&#xff0c; SDS 具有以下优点&#xff1a; 常数复杂度获取字符串…

如何在 Ubuntu 14.04 上使用 Heartbeat 和保留 IP 创建高可用性设置

简介 Heartbeat 是一个开源程序&#xff0c;为客户端服务器提供集群基础设施功能——集群成员资格和消息传递&#xff0c;这是高可用性&#xff08;HA&#xff09;服务器基础设施中的关键组件。通常&#xff0c;Heartbeat 与集群资源管理器&#xff08;CRM&#xff09;&#x…

R语言学习—4—数据矩阵及R表示

1、创建向量、矩阵 在R中&#xff0c;c()函数用于创建向量或组合数据对象。它在某些情况下可能会被省略&#xff0c;因为R有一些隐式的向量创建规则。例如&#xff0c;当你使用:操作符创建一个数字序列时&#xff0c;R会自动创建一个向量&#xff0c;所以你不需要显式地调用c()…

UI-Diffuser——使用生成式扩散模型的UI原型设计算法解析

概述。 移动UI是影响参与度的一个重要因素&#xff0c;例如用户对应用的熟悉程度和使用的便利性。如果你有一个类似的应用程序&#xff0c;你可能会选择一个具有现代、好看的设计的应用程序&#xff0c;而不是一个旧的设计。然而&#xff0c;要从头开始研究什么样的UI最适合应…

[leetcode]Z 字形变换

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string convert(string s, int numRows) {int n s.length(), r numRows;if (r 1 || r > n) {return s;}int t r * 2 - 2;int c (n t - 1) / t * (r - 1);vector<string> mat(r, string(c, 0)…

商城数据库(51 52 53 54 55 56 57 58 59 60)

51 CREATE TABLE sxh_log_sms (smsId int(11) NOT NULL AUTO_INCREMENT COMMENT 自增id,smsSrc tinyint(4) NOT NULL DEFAULT 0 COMMENT 消息类型(0:系统消息 ,扩散),smsUserId int(11) NOT NULL DEFAULT 0 COMMENT 发现者ID,smsContent varchar(255) NOT NULL COMMENT 短信内…

Allure 测试报告框架提供了哪些标签,这些标签分别是什么意思

Allure 测试报告框架提供了一些标签&#xff08;Tags&#xff09;用于标识和组织测试报告中的测试用例和测试套件。以下是一些常用的 Allure 标签及其含义&#xff1a; Feature&#xff1a; 含义&#xff1a;用于标识测试用例或测试套件所属的功能模块或特性。示例&#xff1a…

LSM-Tree 原理分析

深入浅出分析LSM树&#xff08;日志结构合并树&#xff09; - 知乎 写得太好了&#xff0c;留下记录。便于复习。 LSM树详解 - 知乎 多了点点内容&#xff0c;也看看吧。

达梦(DM) SQL聚集函数及日期运算操作

达梦DM SQL聚集函数及日期运算操作 聚集函数MAX、MIN、SUM、AVG、COUNT使用分析函数 sum (…) over (order by…) 可以生成累计和更改累计和的值计算出现次数最多的值 日期运算加减日、月、年加减时、分、秒日期间隔之时、分、秒日期间隔之日、月、年求两个日期间的工作天数确定…

QT知识体系框架及对应文章汇总

文章目录 IDE用法基本界面实现基本控件和窗体控件布局和定位应用程序主窗口界面外观样式实现事件系统实现控件窗体关联通信 图形动画2D图形绘制3D图形绘制图形视图框架动画状态切换多媒体应用 数据处理和展示普通文件特殊文件模型视图框架数据库各种数据结构 通信及部署进程/线…

Java基础知识(三) -- 流程控制

不论哪种编程语言&#xff0c;都会提供两种基本的流程控制结构&#xff1a;分支结构和循环结构。其中分支结构用于实现根据条件来选择性地执行某段代码&#xff0c;循环结构则用于实现根据循环条件重复执行某段代码。 1. 顺序结构 任何编程语言中最常见的程序结构就是顺序结构…

单片机编程实例400例大全(100-200)

今天继续分享单片机编程实例第100-200例。 今天的实例会比前面100复杂一些&#xff0c;我大概看了下&#xff0c;很多都具备实际产品的参考价值。 今天继续分享单片机编程实例第100-200例。 今天的实例会比前面100复杂一些&#xff0c;我大概看了下&#xff0c;很多都具备实际…

频分复用系统设计及其MATLAB实现

引言 随着通信技术的飞速发展&#xff0c;通信系统的容量需求不断增长。频分复用&#xff08;Frequency Division Multiplexing, FDM&#xff09;作为一种重要的多路复用技术&#xff0c;被广泛应用于现代通信系统中。本文将介绍频分复用系统的设计原理&#xff0c;并展示如何…

简单工厂模式、工厂方法模式和抽象工厂模式

1、简单工厂模式 1.1 结构 简单工厂包含如下角色&#xff1a; 抽象产品 &#xff1a;定义了产品的规范&#xff0c;描述了产品的主要特性和功能。 具体产品 &#xff1a;实现或者继承抽象产品的子类 具体工厂 &#xff1a;提供了创建产品的方法&#xff0c;调用者通过该方法…

centos部署前后端项目

这一次我们不用宝塔面板了&#xff0c;用docker部署后端&#xff0c;nginx部署前端 1.python环境安装 1&#xff09;环境准备&#xff1a;centos7安装minicondaMiniconda入门&#xff1a;在CentOS上的安装、基本操作、目录结构、卸载_centos 安装miniconda-CSDN博客【Linux】…