百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

用Python实现十大经典排序算法-插入、选择、快速、冒泡、归并等

off999 2024-10-27 11:50 33 浏览 0 评论

本文来用图文的方式详细讲解了Python十大经典排序算法 —— 插入排序、选择排序、快速排序、冒泡排序、归并排序、希尔排序、插入排序、桶排序、基数排序、计数排序算法,想要学习的你们,继续阅读下去吧,如果觉得不错的话,推荐给身边的朋友吧。

插入排序

思路

  1. 从第一个元素开始,该元素可以认为已经被排序;
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  5. 将新元素插入到该位置;
  6. 重复步骤2~5。

代码

图示

平均时间复杂度

O(n^2)


希尔排序

前言

希尔排序是插排的升级,先将待排序的元素进行分组,在分组的基础上进行插排,从而降低整体上的时间复杂度。

这里面设计到一个增量的概念,我们依据增量来决定分组的跨度。常用的增量有三种:

  • 希尔增量 [1,2,4,8,…,2^(k-1)]
  • 海巴德增量 [1,3,7,15,…,2^k-1]
  • 塞基维克增量 [1,5,19,41,…,4k-3*2k+1]

一般情况下希尔增量带来的时间复杂度小于O(n2),但在极坏情况下可能效果不明显甚至超过这个值。海巴德增量可以将时间复杂控制在O(n(3/2))以下,而塞基维克增量该项参数为O(n^(4/3))。

思路

  1. 择定增量
  2. 分组
  3. 组内比较
  4. 重复步骤2,3直到跨度为1

图示

代码


选择排序

思路

  1. 选出数组中最大(最小)的元素放到开头
  2. 在剩下的元素中选中最大(最小)元素放到上个被选元素之后
  3. 重复2步骤

图示

代码

平均时间复杂度

O(n^2)


堆排序

前言

堆排序,顾名思义,就是基于堆。因此先来介绍一下堆的概念。

堆分为最大堆和最小堆,其实就是完全二叉树。最大堆要求节点的元素都要大于其孩子,最小堆要求节点元素都小于其左右孩子,两者对左右孩子的大小关系不做任何要求,其实很好理解。有了上面的定义,我们可以得知,处于最大堆的根节点的元素一定是这个堆中的最大值。其实我们的堆排序算法就是抓住了堆的这一特点,每次都取堆顶的元素,将其放在序列最后面,然后将剩余的元素重新调整为最大堆,依次类推,最终得到排序的序列。

思路

  1. 把堆顶的最大数取出
  2. 将剩余的堆继续调整为最大堆
  3. 重复步骤1,2

图示

代码

平均时间复杂度

O(nlogn)


冒泡排序

思路

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

图示

代码

平均时间复杂度

O(n^2)


快速排序

思路

  1. 先从集合中取出一个数作为“哨兵”
  2. 将集合中比哨兵大的元素和比哨兵小的元素分列两侧
  3. 再对左右区间重复第二步,直到各区间只有一个数

图示

代码

平均时间复杂度

O(nlogn)


归并排序

思路

  1. 将列表拆分成两个有序子模块
  2. 递归拆分
  3. 子模块内部进行排序并合并成大的模块
  4. 递归合并

图示

代码

平均时间复杂度

O(nlogn)


计数排序

思路

  1. 找出集合中最小数m和最大数n
  2. 建一个长为(m-n+1)的列表count_list,所有元素初始化为0
  3. 遍历集合,元素减去n得到的结果作为index,将count_list该位上的元素加1。
  4. 初始化空列表result。
  5. 将count_list序列化,用索引值减去n,得到的结果追加到result中,索引值对应的位元素值减1,直到它为0。
  6. 重复步骤5。

图示

代码

平均时间复杂度

O(n)


桶排序

前言

桶排序是将待排序集合中处于同一个值域的元素存入同一个桶中,也就是根据元素值特性将集合拆分为多个区域,则拆分后形成的多个桶,从值域上看是处于有序状态的。对每个桶中元素进行排序,则所有桶中元素构成的集合是已排序的。

思路

  1. 根据待排序集合中最大元素和最小元素的差值范围和映射规则,确定申请的桶个数;
  2. 遍历待排序集合,将每一个元素移动到对应的桶中;
  3. 对每一个桶中元素进行排序,并移动到已排序集合中。

图示

代码

平均时间复杂度

O(n^2)


基数排序

思路

  1. 首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶中;
  2. 接下来将这些桶中的数值重新串接起来,成为以下的数列。接着再进行一次分配,这次是根据十位数来分配;
  3. 接下来将这些桶中的数值重新串接起来,持续进行以上的动作直至最高位数为止。

图示

代码

平均时间复杂度

O(d*2*n), 这里的d是数值位数


本文来自热心好友原味吐司的投稿,点赞!

更多有关python、深度学习和计算机编程的精彩内容,可以关注微信公众号:码农的后花园

相关推荐

阿里云国际站ECS:阿里云ECS如何提高网站的访问速度?

TG:@yunlaoda360引言:速度即体验,速度即业务在当今数字化的世界中,网站的访问速度已成为决定用户体验、用户留存乃至业务转化率的关键因素。页面加载每延迟一秒,都可能导致用户流失和收入损失。对...

高流量大并发Linux TCP性能调优_linux 高并发网络编程

其实主要是手里面的跑openvpn服务器。因为并没有明文禁p2p(哎……想想那么多流量好像不跑点p2p也跑不完),所以造成有的时候如果有比较多人跑BT的话,会造成VPN速度急剧下降。本文所面对的情况为...

性能测试100集(12)性能指标资源使用率

在性能测试中,资源使用率是评估系统硬件效率的关键指标,主要包括以下四类:#性能测试##性能压测策略##软件测试#1.CPU使用率定义:CPU处理任务的时间占比,计算公式为1-空闲时间/总...

Linux 服务器常见的性能调优_linux高性能服务端编程

一、Linux服务器性能调优第一步——先搞懂“看什么”很多人刚接触Linux性能调优时,总想着直接改配置,其实第一步该是“看清楚问题”。就像医生看病要先听诊,调优前得先知道服务器“哪里...

Nginx性能优化实战:手把手教你提升10倍性能!

关注△mikechen△,十余年BAT架构经验倾囊相授!Nginx是大型架构而核心,下面我重点详解Nginx性能@mikechen文章来源:mikechen.cc1.worker_processe...

高并发场景下,Spring Cloud Gateway如何抗住百万QPS?

关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen。高并发场景下网关作为流量的入口非常重要,下面我重点详解SpringCloudGateway如何抗住百万性能@m...

Kubernetes 高并发处理实战(可落地案例 + 源码)

目标场景:对外提供HTTPAPI的微服务在短时间内收到大量请求(例如每秒数千至数万RPS),要求系统可弹性扩容、限流降级、缓存减压、稳定运行并能自动恢复。总体思路(多层防护):边缘层:云LB...

高并发场景下,Nginx如何扛住千万级请求?

Nginx是大型架构的必备中间件,下面我重点详解Nginx如何实现高并发@mikechen文章来源:mikechen.cc事件驱动模型Nginx采用事件驱动模型,这是Nginx高并发性能的基石。传统...

Spring Boot+Vue全栈开发实战,中文版高清PDF资源

SpringBoot+Vue全栈开发实战,中文高清PDF资源,需要的可以私我:)SpringBoot致力于简化开发配置并为企业级开发提供一系列非业务性功能,而Vue则采用数据驱动视图的方式将程序...

Docker-基础操作_docker基础实战教程二

一、镜像1、从仓库获取镜像搜索镜像:dockersearchimage_name搜索结果过滤:是否官方:dockersearch--filter="is-offical=true...

你有空吗?跟我一起搭个服务器好不好?

来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。昨天闲的没事的时候,随手翻了翻写过的文章,发现一个很严重的问题。就是大多数时间我都在滔滔不绝的讲理论,却很少有涉及动手...

部署你自己的 SaaS_saas如何部署

部署你自己的VPNOpenVPN——功能齐全的开源VPN解决方案。(DigitalOcean教程)dockovpn.io—无状态OpenVPNdockerized服务器,不需要持久存储。...

Docker Compose_dockercompose安装

DockerCompose概述DockerCompose是一个用来定义和管理多容器应用的工具,通过一个docker-compose.yml文件,用YAML格式描述服务、网络、卷等内容,...

京东T7架构师推出的电子版SpringBoot,从构建小系统到架构大系统

前言:Java的各种开发框架发展了很多年,影响了一代又一代的程序员,现在无论是程序员,还是架构师,使用这些开发框架都面临着两方面的挑战。一方面是要快速开发出系统,这就要求使用的开发框架尽量简单,无论...

Kubernetes (k8s) 入门学习指南_k8s kubeproxy

Kubernetes(k8s)入门学习指南一、什么是Kubernetes?为什么需要它?Kubernetes(k8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。它...

取消回复欢迎 发表评论: