【排序】算法(python实现)

文章目录

  • python 排序算法
    • 1 插入排序
      • 1.1 直接插入排序
        • 算法思想
      • 1.2 希尔排序
        • 算法思想
    • 2. 选择排序
      • 2.1 简单选择排序
    • 2.2 堆排序
    • 参考

在这里插入图片描述

python 排序算法

1 插入排序

1.1 直接插入排序

算法思想

直接插入排序的核心思想就是:将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过。
因此,从上面的描述中我们可以发现,直接插入排序可以用两个循环完成:

  • 第一层循环:遍历待比较的所有数组元素

  • 第二层循环:将本轮选择的元素(selected)与已经排好序的元素(ordered)相比较。如果:selected > ordered,那么将二者交换

      #直接插入排序def insert_sort(L):#遍历数组中的所有元素,其中0号索引元素默认已排序,因此从1开始for x in range(1,len(L)):#将该元素与已排序好的前序数组依次比较,如果该元素小,则交换#range(x-1,-1,-1):从x-1倒序循环到0for i in range(x-1,-1,-1):#判断:如果符合条件则交换if L[i] > L[i+1]:L[i] ,L[i+1] = L[i+1],L[i]return L
    

1.2 希尔排序

在这里插入图片描述

算法思想

希尔排序在数组中采用跳跃式分组的策略,通过某个增量(gap初始值一般为len(元素长度)//2)将数组元素划分为若干组,然后分组进行插入排序,这算是一趟排序,(下一趟)随后逐步缩小增量,继续按组进行插入排序操作,直至增量为1。希尔排序通过这种策略使得整个数组在初始阶段达到从宏观上看基本有序,小的基本在前,大的基本在后。然后缩小增量,到增量为1时,其实多数情况下只需微调即可,不会涉及过多的数据移动。
解法1:

def shell_sort(alist):"""希尔排序"""n = len(alist)gap = n // 2while gap >= 1:for j in range(gap, n):i = jwhile (i - gap) >= 0:if alist[i] < alist[i - gap]:alist[i], alist[i - gap] = alist[i - gap], alist[i]i -= gapelse:breakgap //= 2if __name__ == '__main__':alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]print("原列表为:%s" % alist)shell_sort(alist)print("新列表为:%s" % alist)

解法2:

def shell_sort(alist):gap = len(alist)while gap > 1:gap = gap // 2for i in range(gap, len(alist)):for j in range(i % gap, i, gap):if alist[i] < alist[j]:alist[i], alist[j] = alist[j], alist[i]return alistalist = shell_sort([4,5,6,7,3,2,6,9,8])
print (alist)

2. 选择排序

2.1 简单选择排序

选择排序不受输入数据的影响,即在任何情况下时间复杂度不变。选择排序每次选出最小的元素,因此需要遍历 n-1 次。
在这里插入图片描述
def selectionSort(nums):
for i in range(len(nums) - 1): # 遍历 len(nums)-1 次
minIndex = i
for j in range(i + 1, len(nums)):
if nums[j] < nums[minIndex]: # 更新最小值索引
minIndex = j
nums[i], nums[minIndex] = nums[minIndex], nums[i] # 把最小数交换到前面
return nums

2.2 堆排序

堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:

  • 大根堆:每个节点的值都大于或等于其子节点的值,用于升序排列;
  • 小根堆:每个节点的值都小于或等于其子节点的值,用于降序排列。
    在这里插入图片描述

参考

(1).https://blog.csdn.net/mxz19901102/article/details/80087596
(2).https://www.jianshu.com/p/bbbab7fa77a2

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

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

相关文章

OpenSSL漏洞补救办法详解(转)

CVE-2014-0160漏洞背景 2014年4月7日OpenSSL发布了安全公告&#xff0c;在OpenSSL1.0.1版本中存在严重漏洞(CVE-2014-0160)。OpenSSL Heartbleed模块存在一个BUG&#xff0c;问题存在于ssl/dl_both.c文件中的心跳部分&#xff0c;当攻击者构造一个特殊的数据包&#xff0c;满足…

SharePoint 自定义WebPart之间的连接

1、创建SharePoint解决方案&#xff0c;添加两个WebPart分别用来发送和接收&#xff1b; 2、发送值的WebPart需要继承自IWebPartField(当然&#xff0c;根据需要还可以选择IWebPartField,IWebPartParameters,IWebPartRow,IWebPartTable&#xff0c;具体参见msdn)&#xff0c;原…

[python 进阶] 9. 符合Python风格的对象

文章目录9.1 对象表示形式9.2 再谈向量类9.3 备选构造方法9.4 classmethod与staticmethod9.5 格式化显示9.6 可散列的Vector2d什么是可散列的数据类型9.6 可散列的Vector9.7 Python的私有属性和“受保护的”属性9.8 使用 __slots__ 类属性节省空间本章包含以下话题&#xff1a;…

android软件获取系统签名

有时候有的功能必须要有系统签名才能使用&#xff0c;例如调用系统自带的Surface.screenShot方法时&#xff0c;就必须在androidManifest.xml里声明android:sharedUserId"android.uid.system" 但是这个时候在编译生成的apk很有可能无法安装的情况 并且报这个错误&…

Python3中的可变与不可变类型

在描述变量是否是可变类型时&#xff0c;可变与否实际上说的是对变量进行“修改”时变量的内存地址是否会发生变化&#xff0c;而非值是否可变。在Python中&#xff0c;对不可变的变量进行“修改”实际上是重新赋值&#xff0c;对可变的变量进行修改才是真正的修改&#xff0c;…

python中带*(单星号)的变量和**(双星号)的变量

一、*args的使用方法 *args 用来将参数打包成tuple给函数体调用二、**kwargs的使用方法 **kwargs 打包关键字参数成dict给函数体调用注意点&#xff1a;参数arg、*args、**kwargs三个参数的位置必须是一定的。必须是(arg,*args,**kwargs)这个顺序&#xff0c;否则程序会报错。单…

百度知道回答的依赖注入

oC 或者 DI 或者 ...一大堆的缩写词不管是面向对象&#xff0c;还是面向过程&#xff0c;都需要分成许多的块&#xff0c;然后由这些部件协同工作完成任务 要协同工作就会产生依赖&#xff0c;一个方法调用另一个方法&#xff0c;一个对象包含另一个对象 如果对象A包含对象B的话…

Django model中的 class Meta 详解

参考 (1) https://www.cnblogs.com/tongchengbin/p/7670927.html

C\C++ 获取当前路径

C\C 获取当前路径 获取当前工作目录是使用函数&#xff1a;getcwd。cwd指的是“current working directory”&#xff0c;这样就好记忆了。 函数说明&#xff1a; 函数原型&#xff1a;char* getcwd(char* buffer, int len); 参数&#xff1a;buffer是指将当前工作…

[python进阶]11接口:从协议到抽象基类

本章讨论的话题是接口&#xff1a;从鸭子类型的代表特征动态协议&#xff0c;到使接口更明确、能验证实现是否符合规定的抽象基类&#xff08;Abstract Base Class&#xff0c;ABC&#xff09;。 首先&#xff0c;本章说明抽象基类的常见用途&#xff1a;实现接口时作为**超类(…

ie11浏览器不能显示最新修改的程序,调试出现代码逻辑错误却依旧执行

1、问题&#xff1a;ie11浏览器不能显示最新修改的程序&#xff0c;调试也不能&#xff0c;出现代码逻辑错误却依旧执行 2、百度解决方案&#xff1a;http://blog.163.com/wang_hj138126/blog/static/1408001062012631508444/ FireFox每次访问页面时检查最新版本 2012-07-31 …

C# 基础备忘录

1. decimal 类型调用ToString()方法后没把末尾的0去掉的解决办法: 例子&#xff1a;decimal? money Convert.ToDecimal(10.8950);string moneyStrmoney.Value.ToString(); 结果在同一台机子&#xff0c;两个项目里面会出现两个不同的结果。结果一&#xff1a;moneyStr"1…

[python进阶]12.继承的优缺点

本章探讨继承和子类化&#xff0c;重点是说明对 Python 而言尤为重要的两个细节&#xff1a; 子类化内置类型的缺点多重继承和方法解析顺序 12.1 子类化内置类型很 12.2 多重继承和方法解析

Android中用GridView实现九宫格的两种方法(转)

Android中用GridView实现九宫格的两种方法http://blog.csdn.net/shakespeare001/article/details/7768455 1.传统办法&#xff1a;实现一个继承BaseAdapter的 ImageAdapter package com.test; import android.app.Activity; import android.content.Context; import andro…

django框架中的模型

文章目录关联关系Many-to-one relationshipsMany-to-many relationshipsdjango学习——model中的get和filter方法的区别模型模型是您的数据唯一而且准确的信息来源。它包含您正在储存的数据的重要字段和行为。一般来说&#xff0c;每一个模型都映射一个数据库表。基础&#xff…

虚拟主机TOMCAT配置

在tomcat中添加虚拟主机&#xff1a;   编辑"tomcat\conf\server.xml"&#xff0c;在"<Engine></Engine>"元素中新加子元素"<Host></Host>"&#xff0c;如下&#xff1a;  </Host>     <Host name&quo…

django框架中表单

参考官方文档,太详细了 (https://docs.djangoproject.com/zh-hans/2.1/topics/forms/)

鸟哥学习笔记六(基础篇第十一章)

type:查看指令是否是bash内建指令 变量的设定规则 1. 变量与变量内容以一个等号『』来连结&#xff0c;如下所示&#xff1a; 『mynameVBird』 2. 等号两边不能直接接空格符&#xff0c;如下所示为错误&#xff1a; 『myname VBird』或『mynameVBird Tsai』3. 变量名称只能…

django-models类索引外键时候的related_name属性作用

其实可以就理解为,一对多关系拿对象的解决 可以把引用理解为主从关系 主引用从,即一对多 , 注意外键字段是放在多的一端的,比如一个班级class 有很多同学 students,那么就在students类里面设置class字段值是外键类型 从students拿class数据很好拿, studet.class就拿到了 但是从…