python实现五大基本算法_算法基础:五大排序算法Python实战教程

排序是每个算法工程师和开发者都需要一些知识的技能。 不仅要通过编码实现,还要对编程本身有一般性的了解。 不同的排序算法是算法设计如何在程序复杂性,速度和效率方面具有如此强大影响的完美展示。

让我们来看看前6种排序算法,看看我们如何在Python中实现它们!

一、冒泡排序

冒泡排序是数据分析中常用的算法,因为它清楚地演示了排序的工作原理,同时简单易懂。 冒泡排序逐步遍历列表并比较相邻的元素对。 如果元素的顺序错误,则会交换元素。 重复遍历列表的未排序部分,直到列表被排序。 因为冒泡排序重复通过列表中未排序的部分,所以它具有最差的O(n2)复杂度。

def bubble_sort(arr):

def swap(i, j):

arr[i], arr[j] = arr[j], arr[i]

n = len(arr)

swapped = True

x = -1

while swapped:

swapped = False

x = x + 1

for i in range(1, n-x):

if arr[i - 1] > arr[i]:

swap(i - 1, i)

swapped = True

return arr

二、选择排序

选择排序也很简单,但通常优于冒泡排序。如果您在两者之间进行选择,最好默认选择排序。 使用Selection排序,我们将输入列表/数组分为两部分:已排序的项目子列表和剩余要排序的项目子列表构成列表的其余部分。 我们首先找到未排序子列表中的最小元素,并将其放在已排序子列表的末尾。 因此我们不断抓取最小的未排序元素,并将其按排序子列表中的排序顺序放置。 该过程以迭代方式继续,直到列表完全排序。

def selection_sort(arr):

for i in range(len(arr)):

minimum = i

for j in range(i + 1, len(arr)):

# Select the smallest value

if arr[j] < arr[minimum]:

minimum = j

# Place it at the front of the

# sorted end of the array

arr[minimum], arr[i] = arr[i], arr[minimum]

return arr

三、插入排序

与冒泡排序和选择排序相比,插入排序更快且可以说更简单。 有趣的是这是有多少人在玩纸牌游戏时对卡片进行排序! 在每次循环迭代中,插入排序从数组中删除一个元素。 然后它会在另一个已排序的数组中找到该元素所属的位置,并将其插入其中。 它重复此过程,直到没有输入元素。

def insertion_sort(arr, simulation=False):

for i in range(len(arr)):

cursor = arr[i]

pos = i

while pos > 0 and arr[pos - 1] > cursor:

# Swap the number down the list

arr[pos] = arr[pos - 1]

pos = pos - 1

# Break and do the final swap

arr[pos] = cursor

return arr

四、合并排序

合并排序是Divide and Conquer算法的完美典范。 它简单地使用了这种算法的2个主要步骤:

(1)连续划分未排序列表,直到有N个子列表,其中每个子列表有1个“未排序”元素,N是原始数组中元素的数量。

(2)反复合并,即一次比较2个子列表,以产生新的排序子列表,直到所有元素完全合并为单个排序数组。

def merge_sort(arr):

# The last array split

if len(arr) <= 1:

return arr

mid = len(arr) // 2

# Perform merge_sort recursively on both halves

left, right = merge_sort(arr[:mid]), merge_sort(arr[mid:])

# Merge each side together

return merge(left, right, arr.copy())

def merge(left, right, merged):

left_cursor, right_cursor = 0, 0

while left_cursor < len(left) and right_cursor < len(right):

# Sort each one and place into the result

if left[left_cursor] <= right[right_cursor]:

merged[left_cursor+right_cursor]=left[left_cursor]

left_cursor += 1

else:

merged[left_cursor + right_cursor] = right[right_cursor]

right_cursor += 1

for left_cursor in range(left_cursor, len(left)):

merged[left_cursor + right_cursor] = left[left_cursor]

for right_cursor in range(right_cursor, len(right)):

merged[left_cursor + right_cursor] = right[right_cursor]

return merged

五、快速排序

快速排序也是一种分而治之的算法。 虽然它有点复杂,但在大多数标准实现中,它的执行速度明显快于合并排序,很少达到O(n²)的最坏情况复杂度。 它有3个主要步骤:

(1)我们首先从数组中选择一个数据作为基准数。

(2)将小于基准数的所有元素移动到基准数的左侧; 将所有大于基准数的元素移动到基准数的右侧。 这称为分区操作。

(3)递归地将上述两个步骤分别应用于每个元素子阵列,直到其值小于和大于最后一个基准数。

def partition(array, begin, end):

pivot_idx = begin

for i in xrange(begin+1, end+1):

if array[i] <= array[begin]:

pivot_idx += 1

array[i], array[pivot_idx] = array[pivot_idx], array[i]

array[pivot_idx], array[begin] = array[begin], array[pivot_idx]

return pivot_idx

def quick_sort_recursion(array, begin, end):

if begin >= end:

return

pivot_idx = partition(array, begin, end)

quick_sort_recursion(array, begin, pivot_idx-1)

quick_sort_recursion(array, pivot_idx+1, end)

def quick_sort(array, begin=0, end=None):

if end is None:

end = len(array) - 1

return quick_sort_recursion(array, begin, end)

微信公众号:python练手项目实战

更多机器学习算法的学习欢迎关注我们。对机器学习感兴趣的同学欢迎大家转发&转载公众号文章,让更多学习机器学习的伙伴加入公众号《python练手项目实战》,在实战中成长。同时欢迎在公众号内留言;

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

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

相关文章

将10进制整数转换成16进制整数输出

题意&#xff1a; 把十进制整数转换为十六进制&#xff0c;格式为0x开头&#xff0c;10~15由大写字母A~F表示。 Input 每行一个整数x&#xff0c;0< x < 2^31。 Output 每行输出对应的八位十六进制整数&#xff0c;包括前导0。 案例输出&#xff1a; Sample Input 0 1023…

opencvpython教程百度云资源_Python+OpenCV图像处理入门,视频教程下载

课程介绍&#xff1a; 李老师讲课生动、深入浅出&#xff0c;出版OpenCV编程案例详解、Python-OpenCV图穷录、MATLAB图像处理、MATLAB图像案例教程等在线课程。 本课程系统概括了Python-OpenCV的使用方法&#xff0c;让学习者快速入门。根据本课程规划的图书《Python-OpenCV图穷…

将结构体写入文件_将COCO检测结果写入json文件

最近很多朋友留言问我如何将检测结果写入json文件并且用于COCO API的评估&#xff0c;之前对于检测结果的格式已经做了简单的说明&#xff0c;这里提供一些简单的函数&#xff0c;直接调用将结果写入即可。用于COCO API测试的文件格式HUST小菜鸡&#xff1a;用于COCO API测试的…

LR通过SiteScope监控mysql

SiteScope下载&#xff0c;安装 要想使用LoadRunner监测MySQL数据库的性能&#xff0c;LoadRunner没有提供直接监测 MySQL的功能&#xff0c;所以&#xff0c;我们需要借助sitescope监控&#xff0c;然后在LoadRunner显示sitescope监测结果&#xff0c;这样间接地监控MySQL性能…

js for循环_JS 函数的执行时机(深入理解6个6)

定时器&#xff1a;setTimeout()setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式提示&#xff1a; 1000 毫秒 1 秒。 提示&#xff1a; 如果你只想重复执行可以使用 setInterval() 方法。 提示&#xff1a; 使用 clearTimeout() 方法来阻止函数的执行。语法&#x…

OCLint+Xcode 代码规范利器

很多公司里面都会强调代码规范的问题&#xff0c;开发者也都知道代码规范的好处。可实际开发中往往因为各种原因使我们把它的优先级不知不觉中降低了。  这里向一个有代码追求和洁癖的程序猿推荐一个分析工具&#xff0c;它可以成为你重构代码或着review的基本规则 OCLint是一…

python指定文件路径_python实现指定文件夹下的指定文件移动到指定位置

# coding:utf-8 import os import shutil import sys reload(sys) sys.setdefaultencoding(utf8) # print os.getcwd() # 有些文件夹下面有很多文件夹&#xff0c;每个文件夹下面有很多视频文件&#xff0c;现在通过脚本&#xff0c;将文件夹下面的所有文件转移到一个目录下面 …

MySQL求类型为GX的平均积分_mysql基本操作

一、连接操作格式&#xff1a;mysql-h主机地址 -u用户名 -p用户密码例&#xff1a;连接到远程主机上的mysql假设远程主机的IP为&#xff1a;110.110.110.110用户名为root,密码为abcd123则键入以下命令&#xff1a;mysql-h110.110.110.110-uroot-pabcd123二、用户级操作1、selec…

PC-红警联机问题与下载

或许不是软件问题&#xff1a; 你做好相关设置了吗&#xff1f; 红警局域网联机的具体方法: 适用于原版红警、尤里复仇&#xff0c;及任何同样的扩展版。 第一步&#xff1a;安装IPX协议。 方法&#xff1a; 控制面板——网络连接&#xff08;或网上邻居属性&#xff09;——本…

k均值聚类算法优缺点_Grasshopper实现K均值聚类算法

本文很长很长&#xff0c;有很多很多图&#xff0c;包含以下部分&#xff1a;1.算法简介2.如何分类平面点3.如何分类空间点4.如何分类多维数据5.后记提醒&#xff1a;以下内容包括&#xff1a;智障操作&#xff0c;无中生友&#xff0c;重复造轮子 等1.算法简介k均值聚类算法&a…

ip地址异常判定python_python检测异常ip,并查询ip详细信息

#!/usr/local/bin/python3# coding:utf-8import string, subprocess, send_mailfrom time import strftime, gmtime, sleep, reimport urllib.request, redef filter_tags(htmlstr):re_cdata re.compile(//]*//\]\]>, re.I) # 匹配CDATAre_script re.compile(]*>[^, re…

保持充沛的精力

转载的&#xff1a;原文地址&#xff1a;http://www.cnblogs.com/siylz/p/4589134.html不管我们做大事还是小事&#xff0c;最需要的是精力。一个人有了充沛的精力&#xff0c;干什么大事都不成问题。可是有不少人往往把他们那宝贵的精力胡乱挥橄在那些走无意义、自讨苦吃的事情…

php while mysql_我怎么能避免在PHP的While循环中使用MySQL查询

我有一个输出类列表的while循环.在类数据库中,教师名称由用户数据库中的教师ID确定.这是我的数据库结构.Classes Database-----------------------------ID CLASS TEACHER1 product design 3User Database-----------------------------ID NAME3 John Doe因此,当列出我的类时,我…

Jq_网站顶部定时折叠广告

<!DOCTYPE html><html xmlns"http://www.w3.org/1999/xhtml"><head><title>网页顶部定时收起广告jQuery特效 - HoverTree</title><base target"_blank" /><style>a {color:blue;text-decoration:none;}</sty…

fullgc频繁的原因_系统运行缓慢,CPU 100%,Full GC次数过多,这一招帮你全搞定

处理过线上问题的同学基本上都会遇到系统突然运行缓慢&#xff0c;CPU 100%&#xff0c;以及Full GC次数过多的问题。当然&#xff0c;这些问题的最终导致的直观现象就是系统运行缓慢&#xff0c;并且有大量的报警。本文主要针对系统运行缓慢这一问题&#xff0c;提供该问题的排…

python 局域网扫描_Python 简化版扫描局域网存活主机

[code]Python 简化版局域网扫描获取存活主机IP by 郑瑞国1、ping指定IP判断主机是否存活2、ping所有IP获取所有存活主机#注: 若在Linux系统下 ping -n 改为 ping -c若在windows系统下 ping -n 不变import socketimport osimport threadingimport timeIPList []def ping_ip(ip)…

WEKA “Detailed Accuracy By Class”和“Confusion Matrix”含义

原文 Summary &#xff08;总结&#xff09;Correctly Classified Instances&#xff08;正确分类的实例&#xff09; 45 90 %Incorrectly Classified Instances &#xff08;错误分类的实例&#xff09; 5 10 %Kappa …

es删除数据_面试官是怎么来考察你对ES搜索引擎的理解?

来源:http://1t.click/ZdY一. 面试官心理分析问这个&#xff0c;其实面试官就是要看看你了解不了解 es 的一些基本原理&#xff0c;因为用 es 无非就是写入数据&#xff0c;搜索数据。你要是不明白你发起一个写入和搜索请求的时候&#xff0c;es 在干什么&#xff0c;那你真的是…

thinkphp mysql函数_thinkphp对数据库操作有哪些内置函数

getModelName() 获取当前Model的名称getTableName() 获取当前Model的数据表名称switchModel(type,varsarray()) 动态切换模型table() 设置当前操作的数据表field() 设置要查询的数据字段where() 设置查询或者操作条件data(data) 设置数据对象order(order) 设置排序limit(limit)…

一个分布式服务器集群架构方案

0x01.大型网站演化 简单说&#xff0c;分布式是以缩短单个任务的执行时间来提升效率的&#xff0c;而集群则是通过提高单位时间内执行的任务数来提升效率。 集群主要分为&#xff1a;高可用集群(High Availability Cluster)&#xff0c;负载均衡集群(Load Balance Cluster&…