热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

算法工程师之排序算法Python

一个合格的算法工程师应该具有熟练写各种排序算法的本领1,快速排序(n*logn)分治法,主要是它的划分过程,

一个合格的算法工程师应该具有熟练写各种排序算法的本领

1,快速排序(n*logn)

分治法,主要是它的划分过程,即选取一个值将list中不大于该数的放在该数左边,不小于该数的放在该数右边,然后分别对左右两个区间递归划分。

def sortmy(arr, low, high):if low = key:high -= 1arr[low] = arr[high]while low sortmy(arr, 0, len(arr) - 1)
print(arr)

2, 冒泡排序(n^2)

每次循环将最大的值放在数组最后

def sortmy(arr, n):while n:for i in range(n-1):if arr[i] > arr[i+1]:arr[i], arr[i+1] = arr[i+1], arr[i]n -= 1arr = list(map(int, input().split()))
sortmy(arr, len(arr))
print(arr)

3,堆排序(n*logn)

先构建大根堆(没有排好序),然后将堆顶位置的值(即最大值)与最后一个值交换,然后再将更新后的大根堆进行重新构建,最后会得到一个排好序的数组。具体参考堆的构建及堆排序(C++)

def sortmy(arr, n):for i in range(int(n / 2 - 1), -1, -1):heapAdjust(arr, i, n - 1)while n - 1:arr[0], arr[n - 1] &#61; arr[n - 1], arr[0]n -&#61; 1heapAdjust(arr, 0, n - 1)def heapAdjust(arr, low, high):"""构建大根堆:param arr::param low::param high::return:"""rc &#61; arr[low] # 头节点i &#61; low * 2 &#43; 1 # 左孩子while i <&#61; high:if i arr[i]: # 头节点大于孩子节点就不操作breakarr[low] &#61; arr[i] # 否则将较大的孩子节点赋值给头节点low &#61; i # 开始将这个较大节点作为新头节点继续遍历i &#61; 2 * i &#43; 1arr[low] &#61; rc # 循环执行完毕需要将一开始的头节点赋值给循环中的新头节点arr &#61; list(map(int, input().split()))
sortmy(arr, len(arr))
print(arr)

4、归并排序

分而治之&#xff0c;核心是将两个有序数组组合成一个有序数组&#xff0c;即下面的归并过程代码

import copy
import randomdef merge(arr, start, mid, end):"""归并过程:param arr::param start::param end::return:"""res &#61; copy.deepcopy(arr)Mid &#61; midfor idx in range(start, end &#43; 1):if start > Mid: # 左分支已遍历完arr[idx] &#61; res[mid &#43; 1]mid &#43;&#61; 1elif mid &#61;&#61; end: # 右分支已遍历完arr[idx] &#61; res[start]start &#43;&#61; 1elif res[start] <&#61; res[mid &#43; 1]: # 左分支的值小于右分支arr[idx] &#61; res[start]start &#43;&#61; 1else:arr[idx] &#61; res[mid &#43; 1] # 左分支的值大于右分支mid &#43;&#61; 1def merge_sort(arr, start, end):"""归并排序递归函数:param arr: :param start: :param end: :return: """if end &#61;&#61; start:returnmid &#61; int((start &#43; end) / 2)merge_sort(arr, start, mid)merge_sort(arr, mid &#43; 1, end)merge(arr, start, mid, end)a &#61; random.sample(range(100), 100)
print(a)
merge_sort(a, 0, len(a) - 1)
print(a)

5、选择排序

挺垃圾的一种排序方法&#xff0c;还不如冒泡

import randomdef select_sort(arr, n):"""选择排序:param arr::return:"""for i in range(n):minIdx &#61; ifor j in range(i, n):if arr[j] print(a)
select_sort(a, len(a))
print(a)

6、插入排序

时间复杂度也挺高&#xff0c;但是代码实现起来设计巧妙如下&#xff0c;循环遍历数组&#xff0c;将未排序的数一个个插入到前面已排好序的数组中&#xff0c;未申请额外空间

import randomdef insert_sort(arr, n):"""插入排序:param arr::param n::return:"""for i in range(1, n):for j in range(i - 1, -1, -1):if arr[j&#43;1] print(a)
insert_sort(a, len(a))
print(a)

7、希尔排序

插入排序的改进版&#xff0c;设计的非常巧妙&#xff0c;也可以说插入排序是特殊情况的希尔排序&#xff0c;即gap设为1时&#xff0c;两者就是一样的。只不过shell由小及大&#xff0c;通过设置不同的增量&#xff08;这里的增量是[n/2, n/2/2, ..., 1]&#xff0c;也可以设为其他&#xff09;来实现最终的排序。

import randomdef shell_sort(arr, n):"""希尔排序:param arr::param n::return:"""gap &#61; int(n / 2)while gap:for i in range(gap, n):for j in range(i - gap, -1, -gap):if arr[j] > arr[j &#43; gap]:arr[j], arr[j &#43; gap] &#61; arr[j &#43; gap], arr[j]gap &#61; int(gap / 2)a &#61; random.sample(range(100), 100)
print(a)
shell_sort(a, len(a))
print(a)


推荐阅读
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • Explain如何助力SQL语句的优化及其分析方法
    本文介绍了Explain如何助力SQL语句的优化以及分析方法。Explain是一个数据库SQL语句的模拟器,通过对SQL语句的模拟返回一个性能分析表,从而帮助工程师了解程序运行缓慢的原因。文章还介绍了Explain运行方法以及如何分析Explain表格中各个字段的含义。MySQL 5.5开始支持Explain功能,但仅限于select语句,而MySQL 5.7逐渐支持对update、delete和insert语句的模拟和分析。 ... [详细]
author-avatar
手机用户2502858383_827
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有