百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python八大排序(python排序方法有哪几种)

off999 2024-10-04 00:35 17 浏览 0 评论

  • 1.基数排序
  • 2.归并排序
  • 3.堆排序
  • 4.简单选择排序
  • 5.直接插入排序
  • 6.希尔排序
  • 7.快速排序
  • 8.冒泡排序

1.基数排序

基数排序的基本思想是先将数字按照个位数上数字的大小进行排序,排序之后再将已经排过序的数字再按照十位数上数字的大小进行排序,依次推类

# 统计这个列表中数字最大的数字有几位

def radix_sort_nums(nums):

max = nums[0]

for i in nums:

if max < i:

max = i

times = 0

while max > 0:

max = int(max/10)

times += 1

return times

# 每个数字各个位置的数字大小,比如(123,1)则是3,(123,2)则是2

def get_num(num,n):

return (int(num/(10**(n-1)))) % 10

# 主程序

def radix_sort(nums):

count = 10*[None] # 定义的数组,用于存放当前位数的元素个数

bucket = len(nums)*[None] # 用于暂时存放排序结果

# 分别从个位/十位/百位开始循环

for pos in range(1, radix_sort_nums(nums)+1):

# 每次排序完都要清空各个位数存放的数据统计

for i in range(10):

count[i] = 0

for i in range(len(nums)):

# 获得0到9每个位数的个数

j = get_num(nums[i], pos)

count[j] = count[j]+1

# 获得相对应位数的边界值

for i in range(1, 10):

count[i] = count[i] + count[i-1]

for i in range(len(nums)-1, -1, -1):

# 求出相应位数的数字

j = get_num(nums[i], pos)

#将元素按相应位数的上数字的大小排序

bucket[count[j]-1] = nums[i]

#让相应位数上数字相等的元素不会放在同一位置而被替代

count[j] = count[j]-1

# 将暂时存储在bucket的元素数据返回到nums中

for i in range(0, len(nums)):

nums[i] = bucket[i]

return nums

print(radix_sort([45, 32, 8, 33, 12, 22, 19, 97]))

2.归并排序

归并排序其实是将原数列分为很多个小数列将其排序,在小数列排序完之后,再将各个小数列进行排序,最后得到一个全部有序的数列

# 归并排序

# 这个函数主要目的是为了实现合并并排序

def mergearray(nums, first, mid, last, temp):

# i, j分别是第一个组数的第一个位置,第二组数的第一个位置

i, j, k = first, mid+1, 0

# 当俩边数组都存在数的时候,依次比较对应位置的大小

while i <= mid and j <= last:

if nums[i] <= nums[j]:

temp[k] = nums[i]

i = i+1

k = k+1

else:

temp[k] = nums[j]

j = j+1

k = k+1

# 第一组数还有多的数的情况

while i <= mid:

temp[k] = nums[i]

i = i+1

k = k+1

# 第二组数还有多的情况

while (j <= last):

temp[k] = nums[j]

j = j+1

k = k+1

# 将排列过的数组赋予nums(开始的时候只是部分有序,随着递归最后变成全部有序)

for i in range(k):

nums[first+i] = temp[i]

# 分组,利用递归

def merge_sort(nums,first,last,temp):

if first < last:

mid = int((first + last) / 2)

# 分出第一组数

merge_sort(nums, first, mid, temp)

# 分出第二组数

merge_sort(nums, mid+1, last, temp)

# 合并并排序

mergearray(nums, first, mid, last, temp)

def merge_sort_array(nums):

# 创建一个和想要排序数列相同数量的空列表

temp = len(nums)*[None]

# 利用递归进行排序

merge_sort(nums, 0, len(nums)-1, temp)

print(merge_sort_array([45, 32, 8, 33, 12, 22, 19, 97]))

3.堆排序

堆排序利用了二叉树的结构,使子节点的值一直小于根节点

def big_endian(arr, start, end):

root = start

child = root * 2 + 1 # 左孩子

while child <= end:

# 孩子比最后一个节点还大,也就意味着最后一个叶子节点了,就得跳出去一次循环,已经调整完毕

if child + 1 <= end and arr[child] < arr[child + 1]:

# 为了始终让其跟子元素的较大值比较,如果右边大就左换右,左边大的话就默认

child += 1

if arr[root] < arr[child]:

# 父节点小于子节点直接交换位置,同时坐标也得换,这样下次循环可以准确判断:是否为最底层,

# 是不是调整完毕

arr[root], arr[child] = arr[child], arr[root]

root = child

child = root * 2 + 1

else:

break

def heap_sort(nums): # 无序区大根堆排序

first = len(nums) // 2 - 1

for start in range(first, -1, -1):

# 从下到上,从左到右对每个节点进行调整,循环得到非叶子节点

big_endian(nums, start, len(nums) - 1) # 去调整所有的节点

for end in range(len(nums) - 1, 0, -1):

nums[0], nums[end] = nums[end], nums[0] # 顶部尾部互换位置

big_endian(nums, 0, end - 1) # 重新调整子节点的顺序,从顶开始调整

return nums

print(heap_sort([3, 1, 4, 9, 6, 7, 5, 8, 2, 10]))

4.简单选择排序

简单选择排序的方法则是将所选值与剩下值中比他小的值进行比较

比如选取第一个值,往后找到比他小的值就与其对调,对调后的值再接下去进行比较,直至找到最小的值,随后再第二个值……直至循环到倒数第二个值.

def select_sort(nums):

# 遍历所有的值

for i in range(len(nums)):

# 当前位置初始值

min = nums[i]

# 与比他后面的值进行比较,小则互换

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

if nums[j] < min:

nums[j], min = min, nums[j]

# 将值返回数列

nums[i] = min

return nums

print(select_sort([45, 32, 8, 33, 12, 22, 19, 97]))

5.直接插入排序

首先遍历所有元素,随后从第一个数开始将数列从后往前遍历,如果后面的数小于前面的数,则互换位置,依次推类,直到遍历完成

# 直接插入排序

def insert_sort(nums):

for i in range(len(nums)-1):

for j in range(i, -1, -1):

if nums[j] > nums[j+1]:

nums[j], nums[j + 1] = nums[j + 1], nums[j]

return nums

print(insert_sort([45, 32, 8, 33, 12, 22, 19, 97]))

6.希尔排序

希尔排序其实就相当于对直接插入排序的升级版,每次都选取一半的长度,随后利用直接插入法进行排序,从而更快的获得结果


def insert_shell(nums):

# 初始化l值,此处利用序列长度的一半为其赋值

l = int(len(nums)/2)

# 第一层循环:依次改变l值对列表进行分组

while l >= 1:

# 下面:利用直接插入排序的思想对分组数据进行排序

for i in range(len(nums) - 1):

for j in range(i, -1, -1):

if nums[j] > nums[j + 1]:

nums[j], nums[j + 1] = nums[j + 1], nums[j]

# while循环条件折半

l = int(l/2)

return nums

7.快速排序

快速排序首先得选取一个基准值,这个代码用第一个数作为基准值,将比基准值小的值放到左边,比基准值大的值放到右边,随后再将左边后右边按照上述方法进行排序,直到完全正确为止

# 实现快速排序方法的函数

def quick_sort_num(nums,start,end):

if start < end:

# 定义基准值为第一个数

i, j, pivot = start, end, nums[start]

while i < j:

# 将基准数右边的数中比基准数小的放到左边

while i < j and nums[j] >= pivot:

j = j-1

if i < j:

nums[i] = nums[j]

i = i+1

# 将基准数左边的数中比基准数大的数放到右边

while i < j and nums[i] < pivot:

i = i+1

if i < j:

nums[j] = nums[i]

j = j-1

nums[i] = pivot

# 分别将基准数左边的数列和右边的数列进行递归

quick_sort_num(nums, start, i-1)

quick_sort_num(nums, i+1, end)

return nums

# 快速排序主体函数

def quick_sort(nums):

start = 0

end = len(nums)-1

nums = quick_sort_num(nums, start, end)

return nums

print(quick_sort([45, 32, 8, 33, 12, 22, 19, 97]))

8.冒泡排序

冒泡排序是最简单的排序,依次将左右俩个元素进行比较,每次比较完最后的一个数必定是最大的,依次推类,直到全部元素都比较玩

def bubble_sort(nums):

# 交换的轮数

for i in range(len(nums) - 1):

# 每一轮交换

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 nums

print(bubble_sort([45, 32, 8, 33, 12, 22, 19, 97]))

相关推荐

SPC相关的计算用excel和python实现【源码下载】

做SPC分析涉及到很多计算,比如CPK、PPK、概率图、PPM等等,网上很多公式,但具体实现却不是那么容易的。我们整理了这些用excel和python实现的代码。包括但不限于以下的内容:SPC分析中的...

Python学不会来打我(34)python函数爬取百度图片_附源码

随着人工智能和大数据的发展,图像数据的获取变得越来越重要。作为Python初学者,掌握如何从网页中抓取图片并保存到本地是一项非常实用的技能。本文将手把手教你使用Python函数编写一个简单的百度图片...

django python数据中心、客户、机柜、设备资源管理平台源码分享

先转发后关注,私信“资源”即可免费获取源码下载链接!本项目一个开源的倾向于数据中心运营商而开发的,拥有数据中心、客户、机柜、设备、跳线、物品、测试、文档等一些列模块的资源管理平台,解决各类资源集中管理...

熬夜也值得学习练手的108个Python项目(附源码),太实用了!

现在学编程的人越来越多,Python因为简单好上手、功能又强大,成了很多人的首选。不管是做数据分析、人工智能,还是写网络程序、自动化脚本,Python都能派上用场。而且它诞生的时间比网页还早,作为...

这五个办公室常用自动化工具python源码,复制代码就能用

办公室自动化现在能看这文章的恐怕大部分都是办公室久坐工作者,很多都有腰肌劳损、肩周炎等职业病,难道就不能有个工具缓解一下工作量吗?那么恭喜你点进了这篇文章,这篇文章将使用python直接实现五个常...

将python源代码封装成window可执行程序教程

将python源代码封装成window可执行程序教程点击键盘win+r打开运行框在运行框中输入cmd,进入到命令行。在命令行中输入piplist去查看当前电脑中所有的库检查是否有pyinstall...

Python 爬虫如何爬取网页源码?(爬虫获取网页源代码)

下面教大家用几行代码轻松爬取百度首页源码。什么是urllib?urllib库是Python内置的HTTP请求库,它可以看做是处理URL的组件集合。urllib库包含了四大模块,具体如下:urllib....

Python RPC 之 Thrift(python是做什么的)

thrift-0.12.0python3.4.3Thrift简介:Thrift是一款高性能、开源的RPC框架,产自Facebook后贡献给了Apache,Thrift囊括了整个RP...

用Python编写FPGA以太网MAC(附源码下载方式)

来源:EETOP作者:ccpp123略作了解后发现,MyHDL不是高层次综合,它实际上是用Python的一些功能实现了一个Verilog仿真器,能对用Python写的仿Verilog语言进行仿...

python爬虫常用工具库总结(python爬虫工具下载)

说起爬虫,大家可能第一时间想到的是python,今天就简单为大家介绍下pyhton常用的一些库。请求库:实现基础Http操作urllib:python内置基本库,实现了一系列用于操作url的功能。...

手把手教你使用scrapy框架来爬取北京新发地价格行情(理论篇)

来源:Python爬虫与数据挖掘作者:霖hero大家好!我是霖hero。上个月的时候,我写了一篇关于IP代理的文章,手把手教你使用XPath爬取免费代理IP,今天在这里分享我的第二篇文章,希望大家可以...

2025年Python爬虫学习路线:第1阶段 爬虫基础入门开始

这个阶段的目标是让你熟悉Python的基础知识、了解HTTP请求和HTML是如何工作的,并最终完成你的第一个爬虫小项目——抓取名言!按照计划,我们首先要打好Python基础。Python就像是我们要...

如何入门 Python 爬虫?(python零基础爬虫)

1.很多人一上来就要爬虫,其实没有弄明白要用爬虫做什么,最后学完了却用不上。大多数人其实是不需要去学习爬虫的,因为工作所在的公司里有自己的数据库,里面就有数据来帮助你完成业务分析。什么时候要用到爬虫呢...

突破爬虫瓶颈:Python爬虫核心能力提升与案例实操

技术控必看!Python爬虫高手进阶全攻略,解锁数据处理高阶玩法在数字化时代,Python爬虫早已成为数据探索者手中的得力工具。从基础的网页抓取到复杂的数据处理,每一次技术升级都能带来新的突破。本文将...

网络爬虫开源框架(网络爬虫的框架)

目前开源爬虫下载框架是百花齐放,各个编程语言都有,以下主要介绍其中重要的几个:1)python:scrapy,pyspider,gcrawler2)Java:webmagic,WebCollector...

取消回复欢迎 发表评论: