3. 排序算法代码-python

目录

  • 1.冒泡排序
  • 2.快速排序
  • 3.插入排序
  • 4.希尔排序
  • 5.选择排序
  • 6.堆排序
  • 7.归并排序
  • 8. 二分查找

1.冒泡排序

'''冒泡排序'''"""
def BubbleSort(nums):listLength = len(nums)while listLength > 0:for i in range(listLength - 1):if nums[i] > nums[i+1]:nums[i], nums[i+1] = nums[i+1], nums[i]listLength -= 1return nums
"""def BubbleSort(nums):for i in range(len(nums)):for j in range(len(nums) - i - 1):if nums[j] > nums[j+1]:nums[j], nums[j+1] = nums[j+1], nums[j]return numsnums = [5, 2, 8, 4, 7, 4, 3, 9, 2, 0, 16,1]
print(BubbleSort(nums))

2.快速排序

'''快速排序'''def QuickSort(nums, start, end):if start < end:i, j = start, endbase = nums[i]while i < j:while i < j and nums[j] >= base:j -= 1nums[i] = nums[j]while i < j and nums[i] <= base:i += 1nums[j] = nums[i]nums[i] = baseQuickSort(nums, start, i - 1)QuickSort(nums, i+1, end)nums = [9,4,10,8,13,2,15,7]
QuickSort(nums, 0, len(nums)-1)
print(nums)

3.插入排序


'''插入排序'''def InsertSort(nums):for i in range(len(nums)-1):if nums[i] > nums[i+1]:while i>=0 and nums[i] > nums[i+1]:nums[i], nums[i+1] = nums[i+1], nums[i]i -= 1return nums
nums = [9,4,10,8,13,2,15,7]
print(InsertSort(nums))

4.希尔排序

'''希尔排序'''
#①第一层循环 gap折半 直到gap=1
#②二层三层循环直接插入排序
def ShellSort(nums):gap = len(nums) // 2while gap >= 1:for i in range(gap, len(nums)):for j in range(i-gap, -1, -gap):if nums[j] > nums[j+gap]:nums[j], nums[j+gap] = nums[j+gap], nums[j]gap = gap // 2return nums
nums = [9,4,10,8,13,2,15,7]
print(ShellSort(nums))

5.选择排序

'''选择排序'''
def SelectSort(nums):for i in range(len(nums)):for j in range(i+1, len(nums)):if nums[j] < nums[i]:nums[j], nums[i] = nums[i], nums[j]return nums
nums = [5, 2, 8, 4, 7, 4, 3, 9, 2, 0, 1,16]
print(SelectSort(nums))

6.堆排序

最大堆总是将其中的最大值存放在树的根节点。
而对于最小堆,根节点中的元素总是树中的最小值
应用场景
比如求10亿个数中的最大的前10个数,时时构建只有10个元素的小顶堆,如果比堆顶小,则不处理;如果比堆顶大,则替换堆顶,然后依次下沉到适当的位置。
比如求10亿个数中的最小的前10个数,时时构建只有10个元素的大顶堆,如果比堆顶大,则不处理;如果比堆顶小,则替换堆顶,然后依次下沉到适当的位置。
一般升序采用大顶堆,降序采用小顶堆

'''构造大顶堆'''
def HeapBuild(nums):l = len(nums) - 1# 构造大顶堆,从非叶子节点开始倒序遍历,因此是l//2 -1 就是最后一个非叶子节点for i in range(len(nums)//2 - 1, -1, -1):HeapSort(nums, i, l)# 上面的循环完成了大顶堆的构造,那么就开始把根节点跟末尾节点交换,然后重新调整大顶堆for j in range(l, -1, -1):nums[0], nums[j] = nums[j], nums[0]HeapSort(nums, 0, j-1)return numsdef HeapSort(nums, i, l):left, right = 2 * i + 1, 2 * i + 2  # 左右子节点的下标index = i# 构造大顶推if left <= l and nums[i] < nums[left]:index = leftif right <= l and nums[left] < nums[right] and nums[i] < nums[right]:index = rightif index != i:nums[i], nums[index] = nums[index], nums[i]HeapSort(nums, index, l)nums = [17, 13, 40 , 22, 31, 14, 33, 56, 24, 19 ,10, 41, 51, 42, 26]
print('使用大顶堆排序:', HeapBuild(nums))'''构造小顶堆'''
def SmallHeapBuild(nums):l = len(nums) - 1# 从非叶子节点开始倒序遍历,因此是l//2 -1 就是最后一个非叶子节点for i in range(len(nums)//2 - 1, -1, -1):SmallHeapSort(nums, i, l) # 小顶堆构造函数# 上面的循环完成了小顶堆的构造,那么就开始把根节点跟末尾节点交换,然后重新调整大顶堆# 使用小顶堆进行降序,nums[0]是最小的,放到最后for j in range(l, -1 ,-1):nums[0], nums[j] = nums[j], nums[0]SmallHeapSort(nums, 0, j-1)return numsdef SmallHeapSort(nums, i, l):left, right = 2 * i + 1, 2 * i + 2  # 左右子节点的下标index = i# 构建小顶堆if left <= l and nums[i] > nums[left]:index = leftif right <= l and nums[left] > nums[right] and nums[i] > nums[right]:index = rightif index != i:nums[i], nums[index] = nums[index], nums[i]SmallHeapSort(nums, index, l)nums = [17, 13, 40 , 22, 31, 14, 33, 56, 24, 19 ,10, 41, 51, 42, 26]
print('使用小顶堆倒排序', SmallHeapBuild(nums))

7.归并排序


def MergeBuild(nums):if len(nums) == 1:return numsmid = len(nums) // 2left = nums[:mid]right = nums[mid:]l1 = MergeBuild(left)l2 = MergeBuild(right)return MergeSort(l1, l2)def MergeSort(left, right):res = []while len(left) and len(right):if left[0] < right[0]:res.append(left.pop(0))else:res.append(right.pop(0))res += leftres += rightreturn resif __name__ == '__main__':nums = [5, 2, 8, 4, 7, 4, 3, 9, 2, 0, 1,16]res = MergeBuild(nums)print(res)

8. 二分查找

'''二分查找'''
def BinarySearch(target, nums):low = 0high = len(nums)-1while low <= high:mid = (low + high) // 2if nums[mid] == target:return 'target in nums'elif nums[mid] < target:low = mid + 1else:high = mid - 1return 'target not in nums'
nums = [2, 4, 7, 8, 9, 10, 13, 15, 19]
print(BinarySearch(13, nums))
print(BinarySearch(20, nums))

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

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

相关文章

References in code to package

【IntelliJ IDEA】IDE学习使用&#xff08;不时更新&#xff09;_idea references in code to class-CSDN博客

【笔记】从零开始做一个精灵龙女-画贴图阶段(上)

此文只是我的笔记&#xff0c;不包全看懂&#xff0c;有问题可评论 PS贴图加工 1.打开ps 拖入uv图&#xff0c;新建图层&#xff0c;设置背景色为灰色&#xff0c;改一下图层名字 2.按z缩小一下uv图层&#xff0c;拖入实体uv图片&#xff08;目的是更好上色&#xff0c;比如…

鸿蒙语言基础类库:【@ohos.util.Vector (线性容器Vector)】

线性容器Vector 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 Vect…

云原生(Cloud native)

云原生&#xff08;Cloud native&#xff09; 一 定义 目前比较权威的定义主要来自Pivotal公司和云原生计算基金会&#xff08;Cloud Native Computing Foundation&#xff0c;简称CNCF&#xff09;。 1.1 Pivotal 4个要点&#xff1a; DevOps、持续交付、微服务、容器化。六…

【Java后端】Service层读取yml配置文件中内容

前言 最近写代码&#xff0c;看到别人写的读取application.yml配置文件中数据&#xff0c;写的挺规范&#xff0c;挺好的&#xff1b;虽然之前也读取过yml文件&#xff0c;但用的其他方法&#xff0c;没这个规范&#xff0c;所以记录下 正文 假设要读取视频地址&#xff0c;…

微信小程序切换商户号

1.登录微信公众平台小程序 2.功能->微信支付 3.关联成功后会志一关联商户号列表显示 4.登录你需要切换的商户号 在下面选择你需要开通的产品服务 5.切换到账户中心的api安全里面 只需要改变当前下面的配置即可切换小程序的收款商户号 申请API证书按照官方的指引即可解…

关于redis的运维面试题-2

21. Redis的客户端连接数限制如何设置&#xff1f; 在Redis中&#xff0c;客户端连接数的限制可以通过配置文件redis.conf来设置&#xff0c;也可以通过命令行直接设置。以下是如何通过配置文件和命令行来设置Redis客户端连接数限制的步骤和示例代码。 通过配置文件设置客户端…

JS计算某一年的土地租金收入和土地承租支出

涉及到多年的地租 , 例如 2024年5月15日 - 2026年5月15日 , 总承包租金是60000 假设 当前年是2024年 , 则计算2024年5月15日-2024年12月31日的租金收入 , 如果是2025年则是2025年1月1日-2025年12月31日 //示例交易数据 var transactions [ { type: "转出土地收益&qu…

怎么区分住宅IP还是机房IP?机房IP和住宅IP有哪些不同?

在网络技术的应用中&#xff0c;IP地址扮演着至关重要的角色。了解IP地址的种类及其特性&#xff0c;对于进行网络管理、优化网络安全策略、以及实施数据分析等任务至关重要。本文将深入探讨如何区分住宅IP和机房IP&#xff0c;并分析两者的主要差异。 一、IP地址分类简介 IP…

pytorch-RNN存在的问题

这里写目录标题 1. RNN存在哪些问题呢&#xff1f;1.1 梯度弥散和梯度爆炸1.2 RNN为什么会出现梯度弥散和梯度爆炸呢&#xff1f; 2. 解决梯度爆炸方法3. Gradient Clipping的实现4. 解决梯度弥散的方法 1. RNN存在哪些问题呢&#xff1f; 1.1 梯度弥散和梯度爆炸 梯度弥散是…

【人工智能】深度学习:神经网络模型

【人工智能】深度学习&#xff1a;神经网络模型 神经网络基础知识 BP神经网络的概念 单个神经元的结构 CNN模型汇总 LeNet5 模型 AlexNet 模型 VGG模型 Inception Net&#xff08;GoogleNet&#xff09;模型 ResNet &#xff08;残差网络&#xff09; RNN模型&#x…

css实现渐进中嵌套渐进的方法

这是我们想要的实现效果&#xff1a; 思路&#xff1a; 1.有一个底色的背景渐变 2.需要几个小的块级元素做绝对定位通过渐变filter模糊来实现 注意&#xff1a;这里的采用的定位方法&#xff0c;所以在内部的元素一律要使用绝对定位&#xff0c;否则会出现层级的问题&…

小白攻克歌曲“无名的人”,逐句精研的歌唱诀窍

《无名的人》 作词&#xff1a;唐恬 作曲&#xff1a;钱雷 演唱&#xff1a;毛不易 今天不讲解练习技巧&#xff0c;有需要的可以查看往期文章&#xff0c;我给大家带一下无名的人&#xff0c;练习一下情感融入。 对于众多唱歌小白而言&#xff0c;学习歌曲《无名的人》是一…

ctfshow-web入门-文件上传(web164、web165)图片二次渲染绕过

web164 和 web165 的利用点都是二次渲染&#xff0c;一个是 png&#xff0c;一个是 jpg 目录 1、web164 2、web165 二次渲染&#xff1a; 网站服务器会对上传的图片进行二次处理&#xff0c;对文件内容进行替换更新&#xff0c;根据原有图片生成一个新的图片&#xff0c;这样…

【Linux】进程优先级 + 环境变量

前言 在了解进程状态之后&#xff0c;本章我们将来学习一下进程优先级&#xff0c;还有环境变量等。。 目录 1.进程优先级1.1 为什么要有优先级&#xff1f; 2.进程的其他概念2.1 竞争性与独立性2.2 并行与并发2.3 进程间优先级的体现&#xff1a;2.3.1 O(1) 调度算法&#xf…

Apache Web安全分析与增强

Apache HTTP Server 概述 Apache HTTP Server(通常简称为Apache)是一个开源的Web服务器软件,由Apache软件基金会开发和维护。它是全球使用最广泛的Web服务器之一,支持多种操作系统,包括Unix、Linux、Windows和Mac OS X。以下是Apache Web服务器的详细概述,包括其功能特点…

数字高压表0-30kv

最近在制作数字高压表&#xff0c;自己DIY玩玩&#xff0c;有没有朋友一起研究看看

SpringCloud--常用组件和服务中心

常用组件 Euroke和nacos 区别 负载均衡 负载均衡策略有哪些 自定义负载均衡策略

【Red Hat 4.6---详细安装Oracle 19c】---静默方式安装

&#x1f53b; 一、安装前规划 规划项:(本环境) 描述:操作系统版本Red Hat Enterprise Linux Server release 4.6 (Santiago)主机名langtest数据库版本 Oracle 19c IP规划10.10.10.164服务器空间要求根据实际要求数据库名/实例名orcl数据库块大小oracle建库一般设置数据库块大…

物业系统自主研发接口测试框架

1、自主研发框架整体设计 1.1、什么是测试框架? 在了解什么是自动化测试框架之前&#xff0c;先了解一下什么叫框架?框架是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及构件实例间交互的方法;另一种定义认为&#xff0c;框架是可被应用开发者定制的应用骨架…