【LeetCode算法题】各类排序算法的Python实现

系列文章目录

【LeetCode算法题】各类基础排序算法的Python实现

文章目录

  • 系列文章目录
    • 【LeetCode算法题】各类基础排序算法的Python实现
  • 1. 直接插入排序
  • 2. 折半插入排序
  • 3. 选择排序
  • 4. 冒泡排序
  • 5. 归并排序算法
  • 6.快速排序
  • 7. 堆排序
  • 总结

  对于直接插入排序、折半插入排序、选择排序、冒泡排序、归并排序,快速排序、堆排序算法的Python实现进行记录。
注:所有LeetCode系列文章均是为了复习作为记录,思维可能有跳跃,有疑问欢迎一起讨论。


1. 直接插入排序

  将列表分为有序表 nums[ : i] 与无序表 nums[i : ] 两部分,通过“比较” +“移动” 两步操作将 nums[i] 放到有序表对应部分,向后迭代 i 至列表尾部,完成排序。

for i in range(len(nums_1)):for j in range(i):if (nums_1[i] < nums_1[j]):temp = nums_1[i];nums_1[j + 1: i + 1] = nums_1[j: i];nums_1[j] = temp;
print(nums_1)

2. 折半插入排序

  直接插入排序中的 “比较” 实际上为找出 nums[i] 在有序表中的位置,可以将顺序查找优化为折半查找,注意最终查找的位置与 low 和 high 的关系。

for i in range(len(nums_2)):low = 0;high = i - 1;while (low <= high):mid = low + (high - low) // 2;if (nums_2[mid] >= nums_2[i]):high = mid - 1;else:low = low + 1;temp = nums_2[i];nums_2[low + 1 : i + 1] = nums_2[low : i];nums_2[low] = temp;
print(nums_2)

3. 选择排序

  依次选出列表中最小的数,插入表前。

for i in range(len(nums_3)):j = i;temp_index = j;temp = nums_3[j];while (j < len(nums_3)):if (nums_3[j] < temp):temp_index = j;temp = nums_3[j];j = j + 1;nums_3[temp_index] = nums_3[i];nums_3[i] = temp;
print(nums_3)

4. 冒泡排序

  依次交换,大数向后移动,每轮确定一个数的最终位置,当该轮未发生交换时,可提前结束(用tag记录);

for i in range(len(nums_4)):tag = 0;for j in range(len(nums_4) - i - 1):if (nums_4[j] > nums_4[j + 1]):tag = 1;nums_4[j], nums_4[j + 1] = nums_4[j + 1], nums_4[j];if (tag == 0):break
print (nums_4)

5. 归并排序算法

  二路归并,左半部分数组排序,右半部分数组排序,最后合并。

def merge(left, right):""":param left: 有序数组;:param right: 有序数组;:return: 返回合并后的有序数组。"""mat = [];i, j = 0, 0;len_left = len(left);len_right = len(right);while ((i < len_left) & (j < len_right)):if (left[i] < right[j]):mat.append(left[i]);i += 1;else:mat.append(right[j]);j += 1;mat.extend(left[i : ]);mat.extend(right[j : ]);return matdef merge_sort(nums_5):if len(nums_5) <= 1:return nums_5;mid = len(nums_5) // 2;left = merge_sort(nums_5[ : mid]);right = merge_sort(nums_5[mid : ]);return merge(left, right);

6.快速排序

  每轮选出一个 pivot ,使其左边的小于 pivot ,右边大于 pivot 。每轮比较过后,pivot 与 right_idx 的值进行互换。

def quick_sort(array, start_idx, end_idx):if ((end_idx - start_idx) < 1):returnpivot_idx = start_idx;left_idx = start_idx + 1;right_idx = end_idx;while (left_idx <= right_idx):if ((array[left_idx] > array[pivot_idx]) & (array[right_idx] < array[pivot_idx])):array[left_idx], array[right_idx] = array[right_idx], array[left_idx];if (array[left_idx] < array[pivot_idx]):left_idx += 1;if (array[right_idx] > array[pivot_idx]):right_idx -= 1;array[right_idx], array[pivot_idx] = array[pivot_idx], array[right_idx];quick_sort(array, start_idx, right_idx - 1);  # 这里不能用切片,需要对原数组进行修改。quick_sort(array, left_idx, end_idx);

7. 堆排序

  数组与树联系的关键在于, 堆排序主要分为两步操作:建堆 + 弹出。

def Sort(array):for i in range(1, len(array)):father = int((i - 1) / 2);while ((i != 0) and (array[father] > array[i])):         # 逻辑运算符要加括号。array[father], array[i] = array[i], array[father];i = father;father = int((i - 1) / 2);return array;def heap_sort(array):mat = [];while(len(array) != 0):Sort(array);mat.append(array[0]);array = array[1 : ];return mat;print(heap_sort(nums_7))

总结

  简单选择排序、希尔排序、快速排序、堆排序为不稳定算法;快速排序、堆排序、归并排序时间复杂度为:O(nlogn)。

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

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

相关文章

C++ 对一个结构体的集合进行排序,需要的代码

C 对一个结构体的集合进行排序&#xff0c;需要的代码 /* 4 50 10 60 20 100 30 120 16 45 */ #define _CRT_SECURE_NO_WARNINGS#include <iostream> #include<vector> #include <algorithm> // 需要包含 sort() 函数所在的头文件 struct P {int w;//重量int…

docker报错 missing signature key 无法拉去镜像,yum install docker-ce没有可用软件包 解决办法

错误场景描述 今天项目需要用到minio&#xff0c;我打算在虚拟机中使用docker装一个&#xff0c;可是发现当我docker pull minio/minio的时候&#xff0c;报错了missing signature key 这个报错提示的让人很蒙&#xff0c;翻译过来的意思是 “缺少签名密钥” &#xff1f;&am…

鸿蒙开发语言ArkTS--Ability中的生命周期

鸿蒙开发语言ArkTS–Ability中的生命周期 在ArkTS语言中&#xff0c;这是一个在ArkTS中定义Ability生命周期的示例。 Ability的生命周期&#xff1a; onCreate(want, launchParam)&#xff1a;在UI创建后执行的函数。在这个阶段&#xff0c;您可以执行初始化操作&#xff0c;…

7.C++ this指针

每一个非静态成员函数只会诞生一份函数实例&#xff0c;也就是说多个同类型的对象会共用一块代码。 那么这一块代码是如何区分那个对象调用自己的呢&#xff1f;C通过提供特殊的对象指针&#xff0c;this指针&#xff0c;解决上述问题。 this指针指向被调用的成员函数所属的对象…

用 Python 制作可视化 GUI 界面,一键实现自动分类管理文件!

经常杂乱无章的文件夹会让我们找不到所想要的文件&#xff0c;因此小编特意制作了一个可视化GUI界面&#xff0c;通过输入路径一键点击实现文件分门别类的归档。 不同的文件后缀归类为不同的类别 我们先罗列一下大致有几类文件&#xff0c;根据文件的后缀来设定&#xff0c;大…

GaussDB与openGauss有什么相同和不同?

众所周知&#xff0c;GaussDB是华为自主创新研发的分布式关系型数据库&#xff0c;为企业提供功能全面、稳定可靠、扩展性强、性能优越的企业级数据库服务&#xff0c;openGauss是开源数据库&#xff0c;两者之间又是什么样的关系&#xff0c;有什么相同和不同&#xff0c;让我…

如何使用Portainer部署web站点并实现无公网ip远程访问

文章目录 前言1. 安装Portainer1.1 访问Portainer Web界面 2. 使用Portainer创建Nginx容器3. 将Web静态站点实现公网访问4. 配置Web站点公网访问地址4.1公网访问Web站点 5. 固定Web静态站点公网地址6. 固定公网地址访问Web静态站点 前言 Portainer是一个开源的Docker轻量级可视…

kafka消费者

Kafka消费者从属于消费者组&#xff0c;一个组里的消费者订阅的是同一个topic&#xff0c;每个消费者接收topic一部分分区的消息可以为每一个需要获取一个或多个topic全部消息的应用程序创建一个消费者组&#xff0c;每个消费者可以消费若干个分区&#xff0c;往阻力添加消费者…

k8s的PV,PVC自动创建

此部署使用传统的pv&#xff0c;pvc方式做持久化数据存储&#xff0c;而是使用storageclass调用provisioner&#xff0c;自动给pod创建的pvc分配pv并绑定&#xff0c;从而达到持久化存储的效果。可根据自己需求创建相关的pv&#xff0c;pvc。 安装NFS服务 NFS Server IP&…

【spark】SparkSQL

目录 SparkSQL01.快速入门什么是SparkSQL为什么学习SparkSQLSparkSQL的特点SparkSQL发展历史-前身Shark框架SparkSQL发展历史 02.SparkSQL概述SparkSQL和Hive的异同SparkSQL的数据抽象DataFrame概述SparkSession对象 03.DataFrame入门和操作DataFrame的组成DataFrame的代码构建…

NativePHP:开发跨平台原生应用的强大工具

NativePHP 是一种创新性的技术&#xff0c;可以帮助开发者使用 PHP 语言构建原生应用程序。本文将介绍 NativePHP 的概念和优势&#xff0c;探讨其在跨平台应用开发中的应用&#xff0c;并提供一些使用 NativePHP 开发原生应用的最佳实践。 什么是 NativePHP&#xff1f; Nati…

SpringBoot 实现 PDF 添加水印有哪些方案

SpringBoot 实现 PDF 添加水印有哪些方案 方式一&#xff1a;使用 Apache PDFBox 库方式二&#xff1a;使用 iText 库方式三&#xff1a;用 Ghostscript 命令行方式四&#xff1a;Free Spire.PDF for Java方式五&#xff1a;Aspose.PDF for Java 简介 PDF&#xff08;Portable …

小程序显示兼容处理,home键处理

定义&#xff1a; env(safe-area-inset-bottom)和env(safe-area-inset-top)是CSS中的变量&#xff0c;用于获取设备底部和顶部安全区域的大小 示例&#xff1a; padding-bottom: calc(env(safe-area-inset-bottom) 12px); /* 兼容iOS> 11.2 */安全间距类型&#xff1a; …

【消息队列】RocketMQ 并发消费和顺序消费

在 RocketMQ 中&#xff0c;消息的消费模式包括并发消费和顺序消费&#xff0c;它们分别适用于不同的业务场景。下面是对这两种消费模式的介绍&#xff1a; 1. 并发消费&#xff1a; 特点&#xff1a; 并发消费是指多个消费者实例同时处理消息&#xff0c;每个实例独立地处理一…

js实现iframe内容加载失败自动重新加载功能

最近一个项目上的程序经常出现掉线的情况&#xff0c;经排查是该单位的网络不稳定&#xff0c;存在网络丢包现象。导致有时候程序运行加载页面失败&#xff0c;开机自启动应用时出现请求失败的概率非常大&#xff0c;为了解决这个问题我在网上东找西找也没有找到有效的解决办法…

【现代控制系统】最小实现与互质分式

最小实现和互质分式 2023年12月12日 文章目录 最小实现和互质分式1. 实现问题2. SISO严格正则系统的实现2.1 能控标准1型实现2.2 能观标准2型实现2.3 能观标准1型实现2.4 能控标准2型实现2.5 最小实现2.6 完全表征 3. 计算互质分式3.1 使用西尔韦斯特结式 4. SISO基于Markov参…

丰果管道——2024中国家装管道十大品牌

丰果管道——2024中国家装管道十大品牌 丰果&#xff08;中国&#xff09;有限公司 丰果管道品牌创立于1999年&#xff0c;是国内最早从事PPR家装管道生产的品牌之一&#xff0c;在业内有着良好的口碑和市场美誉度&#xff0c;在全国的头部装企更是有相当高的市场占有率。2023年…

猫咪发腮长肉吃什么?5款适合猫咪发腮长肉的猫罐头推荐

随着冬季的来临&#xff0c;北方的小猫咪们因为有暖气&#xff0c;日子还算好过。然而南方的猫咪们只能依靠自己的抵抗力来度过这个寒冷的季节。为了确保这些怕冷的小家伙能温暖地度过冬天&#xff0c;铲屎官们是不是该考虑为它们囤积一些肉肉呢&#xff1f; 有些猫咪&#xf…

Go-gin-example 个人注释添加学习版 第三部分 编写一个简单的文件日志

文章目录 本文目标新建logging包file.go编写log文件当前目录结构 接入自定义的log功能验证功能 _ 学习煎鱼大佬的该项目 煎鱼大佬网站 原github地址 个人github项目地址&#xff0c;希望得到一点star 本文目标 在上一节中&#xff0c;我们解决了 API’s 可以任意访问的问题&a…

无货源跨境电商到底应该怎么做,新手必看

如今&#xff0c;跨境电商无疑已经成为了一个热门的创业领域&#xff0c;但对于一些新手来说&#xff0c;面临的一个主要挑战是如何处理产品的货源问题。下面我就和大家分享一下无货源跨境电商的基本概念以及一些新手可以采取的策略和步骤&#xff0c;帮助大家在这个领域取得成…