算法 - 排序算法

文章目录

  • 1 快速排序
  • 2 堆排序
  • 3.冒泡排序
  • 4.选择排序
  • 5.插入排序

1 快速排序

  • 时间复杂度 O(nlogn)
  • 不稳定
  • 在大多数情况下都是适用的,尤其在数据量大的时候性能优越性更加明显
        def quicksort(start, end, nums):if start >= end:return flag = nums[start]r_ptr = endl_ptr = startwhile (l_ptr < r_ptr):while (l_ptr < r_ptr and nums[r_ptr] >= flag):r_ptr -= 1if (l_ptr < r_ptr):nums[l_ptr] = nums[r_ptr]l_ptr += 1while (l_ptr < r_ptr and nums[l_ptr] < flag):l_ptr += 1if (l_ptr < r_ptr):nums[r_ptr] = nums[l_ptr]r_ptr -= 1nums[l_ptr] = flagquicksort(start, l_ptr - 1, nums)quicksort(l_ptr + 1, end, nums)

2 堆排序

  • 时间复杂度 O(nlogn)
  • 把最大堆堆顶的最大数取出,将剩余的堆继续调整为最大堆,再次将堆顶的最大数取出,这个过程持续到剩余数只有一个时结束
  • 不稳定
  • 建立堆和调整堆的过程中会产生比较大的开销,在元素少的时候并不适用
class MinHeap:def __init__(self):self.array = [-1]def insert_node(self, val):self.array.append(val)index = len(self.array) - 1while (index // 2 != 0):father = index // 2if self.array[father] > self.array[index]:temp = self.array[index]self.array[index] = self.array[father]self.array[father] = tempindex = fathercontinue# 未发生交换,完成插入breakdef delete_node(self):res = self.array[1]self.array[1] = self.array[-1]self.array = self.array[:-1]index = 1length = len(self.array)while (True):# 具有两个子节点if 2*index+1 <= length-1:left = self.array[index*2]right = self.array[index*2+1]if left < right:if self.array[index] > left:temp = self.array[index]self.array[index] = self.array[index*2]self.array[index*2] = tempindex = index * 2continueelse:breakelse:if self.array[index] > right:temp = self.array[index]self.array[index] = self.array[index*2+1]self.array[index*2+1] = tempindex = index * 2 + 1continueelse:break# 一个子节点elif 2*index <= length-1:if self.array[index] > self.array[index*2]:temp = self.array[index]self.array[index] = self.array[index*2]self.array[index*2] = tempindex = index * 2continueelse:break# 没有子节点else:breakreturn res

3.冒泡排序

  • 时间复杂度O(n2)
  • 在相邻元素相等时,它们并不会交换位置,所以冒泡排序是稳定排序
    def bubble(self, array, length):for i in range(length - 1, -1, -1):  # 外层循环:每次需要排序的长度for j in range(i):  # 内层循环:从第一个元素到第i个元素if array[j] > array[j + 1]:pre, post = array[j + 1], array[j]array[j + 1], array[j] = post, prereturn array

4.选择排序

  • 时间复杂度O(n2)
  • 和冒泡排序有一定的相似度,可以认为选择排序是冒泡排序的一种改进
  • 是不稳定的排序算法
    def select(self, array, length):for i in range(length - 1):  # 外层循环的i代表本次循环需要填的位置min_val = array[i]min_idx = ifor j in range(i + 1, length):if min_val > array[j]:min_val = array[j]min_idx = jarray[min_idx] = array[i]array[i] = min_valreturn array

5.插入排序

  • 时间复杂度O(n2)
  • 把待排序的数组分成已排序和未排序两部分,初始的时候把第一个元素认为是已排好序的。从第二个元素开始,在已排好序的子数组中寻找到该元素合适的位置并插入该位置
    def insert(self, array, length):for i in range(1, length):  # 外层循环的i代表当前要处理的位置,i之前已经全部有序val = array[i]ptr = iwhile (ptr > 0 and array[ptr - 1] > val):  # 内层循环寻找插入位置array[ptr] = array[ptr - 1]ptr -= 1array[ptr] = valreturn array

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

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

相关文章

fillrect不填充被覆盖的区域 mfc_quot;条带覆盖quot;猜想的中二证明:quot;球面条线覆盖或点覆盖quot;积分π...

注销&#xff1a;“黎曼猜想”复平面质数单向“虚”圆柱螺旋&#xff1a;几何法证明&#xff0c;技术应用​zhuanlan.zhihu.com假设有这样一部针点打印机从球心对球面打印&#xff0c;外部有一台蓝牙打印&#xff0c;球面打印蓝牙条带打印同步&#xff0c;球面被覆盖&#xff0…

让你变厉害的7个底层思维

职场&认知洞察 丨 作者 / findyi这是findyi公众号分享的第89篇原创文章如果把你的思维比做操作系统&#xff0c;那思维模型就是一个个App。这些App会给你提供新的视角&#xff0c;快速帮你决策&#xff0c;提升你的工作效率。顶级的思维模型能提高你成功的可能性&#xff0…

后端学习 - 计算机网络

文章目录一 基本概念1 计算机网络体系结构2 时延二 应用层&#xff1a;HTTP1 请求和响应报文、常见 header2 URL & RESTful API3 HTTP 协议通信过程4 HTTP 方法5 HTTP 状态码6 短连接、长连接与流水线7 Cookie8 Session三 应用层&#xff1a;HTTPS1 加密方式2 证书认证四 应…

跟我一起学Redis之Redis配置文件啃了一遍之后,从尴尬变得有底气了(总结了一张思维图)...

前言秋高气爽的一天&#xff0c;那时候年轻帅气的我正在参照着搜索引擎写代码&#xff0c;迷之微笑般的敲着键盘(又从搜索引擎上找到代码案例啦)&#xff0c;突然领导在小隔间里传来了呼唤声&#xff0c;然后有了以下场景&#xff1a;领导&#xff1a;小Z&#xff0c;你过来一下…

1093芯片做正弦波逆变器_长途自驾游“缺电”如何选购正确车载逆变器,避开商家套路...

让车友三分钟就能看明白如何选择车用逆变器&#xff0c;节约车友时间。长途自驾游充电是一个难题&#xff0c;手机充电还好办&#xff0c;其他笔记本、电饭煲、车载冰箱或者无人机电池等充电就会用到220V电源&#xff0c;那就必须用到逆变器(逆变器就是将12V或24V直流电&#x…

Spring 相关问题

文章目录Spring1 Spring 框架中用到的设计模式2 Spring 事务、隔离级别3 单例 Bean 是线程安全的吗Spring IOC1 Spring 容器&#xff1a;BeanFactory & ApplicationContext2 依赖注入的两种方式3 Bean 的生命周期4 依赖注入的四个注解5 如何解决循环依赖Spring AOP1 基本概…

达梦php_pdo不同机器安装

现象 extensionphp74_pdo_dm.so extensionlibphp74_dm.so 普通安装达梦pdo.so后运行php报错&#xff1a;Unable to start PDO_DM module in Unknown on line 0 机器上没有达梦服务器环境。 步骤&#xff1a; 1. 拷贝达梦php_pdo到php拓展目录下&#xff0c;更新php.ini。…

ndr4108贴片晶振是多少频率_关于山羊挺身你知道多少?这些干货速来了解一下...

就是因为有些人愿意吃苦&#xff0c;有些人缺乏决心毅力&#xff0c;才会有成功和失败之分。身材不是一天不运动或一天乱吃所造成&#xff0c;瘦身健身的效果也不是一天的努力可以看出来的。如同学业、事业&#xff0c;成功都不是一条直线&#xff0c;而是一条上上下下的崎岖路…

BeetleX之Websocket服务使用

BeetleX.FastHttpApi不仅是一个Webapi服务组件&#xff0c;它同时也是一个Websocket服务组件。由于BeetleX.FastHttpApi的实现是直接支持Websocket Upgrade操作&#xff0c;所以当启动服务后是HTTP还是Websocket完全取决于请求方&#xff1b;其原理和aspcore一样&#xff0c;同…

22日常实习面试记录

最后去快手了 文章目录字节跳动 后端开发实习生-新业务 一面TCL 鸿鹄实验室 一面字节跳动 飞书后端 一面快手 Java信息安全 一面快手 Java信息安全 二面快手 Java信息安全 三面比特大陆 软件开发实习生 一面比特大陆 软件开发实习生 二面字节跳动 后端开发实习生-新业务 一面 算…

typeorm_Nestjs 热更新 + typeorm 配置

Nestjs 开发环境热更新的方案Nestjs 的热更新是基于 Webpack HMR(Hot-Module Replacement) 方案警告请注意&#xff0c;webpack不会自动将您的资产(例如graphql文件)复制到dist文件夹。同样&#xff0c;webpack与glob静态路径(例如TypeOrmModule中的实体属性)不兼容。1 使用 CL…

缓存一致性和跨服务器查询的数据异构解决方案canal

当项目的请求量上去了之后&#xff0c;通常有两种做法来应对高并发&#xff0c;第一是尽最大可能的使用cache来对抗&#xff0c;第二是尽最大可能的分库分表对抗。。。说起来容易&#xff0c;做起来并不那么乐观&#xff0c;这一篇就来浅析下。一&#xff1a;如何保证缓存一致性…

synchronized 实现原理

参考链接 文章目录一 基本使用1 三个作用2 三种用法二 同步原理1 监视器 Monitor2 synchronized 用于同步代码块3 synchronized 用于同步方法3 Mark Word4 对象头的 Mark Word 和线程的 Lock Record三 锁的优化1 自旋锁2 锁消除3 锁粗化4 偏向锁5 轻量级锁、重量级锁以及三种锁…

开头th_是什么文件_Python文件读写最详细的讲解

本文来自公众号&#xff1a;可乐的数据分析之路今天这篇文章来详细讲解一下Python中的文件读写。1、文件读写的流程1)类比windows中手动操作txt文档&#xff0c;说明python中如何操作txt文件&#xff1f;① windows中手动操作txt文件的步骤找到word文档打开word文档查看(或操作…

把 Console 部署成 Windows 服务,四种方式总有一款适合你!

一&#xff1a;背景 1. 讲故事上周有一个项目交付&#xff0c;因为是医院级项目需要在客户的局域网独立部署。程序&#xff1a;netcore 2.0&#xff0c;操作系统&#xff1a;windows server 2012&#xff0c;坑爹的事情就来了, netcore sdk 一直装不上&#xff0c;网上找了资料…

AQS ReentrantLock 实现原理

参考链接 文章目录1 AQS (AbstractQuenedSynchronizer)2 Lock 接口与显式条件3 转账 Demo&#xff1a;解决死锁的两种方案4 ReentrantLock 非公平锁加锁流程5 ReentrantLock 和 synchronized 的异同6 ReentrantReadWriteLock1 AQS (AbstractQuenedSynchronizer) 基于 AQS 的同步…

TensorFlow 2学习和工业CV领域应用 心得分享

我是一名来自苏州的机器视觉开发者&#xff0c;从事传统的机器视觉算法开发有11年了&#xff0c;从2018年开始&#xff0c;因为一些复杂微弱的瑕疵检测项目遇到的传统算法瓶颈&#xff0c;开始接触到了深度学习&#xff0c;并选择了使用TensorFlow&#xff0c;期间也是不断摸索…

历史版本_新版本爆料第弹丨英雄练习新去处,荣耀历史秀出来!

《万物有灵》新版本即将到来新版本来临之前妲己宝宝给自己定下了2个小目标&#xff01;via.小五怎么不开心目标一扩展自己小得可怜的英雄勺成为一名拥有英雄海的补位大神目标二通过自己的实力获得N1个响当当的荣耀称号很多召唤师会有疑问&#xff1a;凭妲己宝宝的实力&#xff…

分布式锁的三种实现

参考链接 文章目录分布式锁的作用分布式锁应该具有的条件实现1 基于数据库实现2 基于 Redis实现3 基于 ZooKeeper分布式锁的作用 分布式锁是一种 跨机器的互斥机制 来控制 共享资源的访问 具体地&#xff0c;为了保证一个方法或属性在高并发情况下的同一时间只能被同一个线程执…

循环遍历多层json_面试官:JSON.stringify() 实现深拷贝有什么问题

为什么要进行深拷贝JS中的变量在内存中存储分为值类型和引用类型&#xff1a; 值类型&#xff1a; 1、占用空间固定&#xff0c;保存在栈中&#xff1b; 2、保存与复制的是值本身&#xff1b; 3、基本类型数据是值类型&#xff08;String,Number,undefined,Boolean,Null&#x…