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

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

off999 2024-10-04 00:35 35 浏览 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]))

相关推荐

电脑系统怎样升级(电脑系统怎么升级)

电脑系统升级方法步骤,1、打开电脑,点击电脑左下角的开始菜单,在弹出的菜单选项中选择“控制面板”。2、点击“开始”,点击“控制面板”3、在控制面板中,点击“系统和安全”。4、点击启用或禁用自动更新。5...

win10正版系统下载网站(win10官方下载网站)
  • win10正版系统下载网站(win10官方下载网站)
  • win10正版系统下载网站(win10官方下载网站)
  • win10正版系统下载网站(win10官方下载网站)
  • win10正版系统下载网站(win10官方下载网站)
windows无法激活(windows无法激活有什么影响)

1.如果修复或重新组装了电脑,则可能是安装了不同版本的Windows。或者,如果在修复过程中为电脑使用了其他产品密钥,当使用该密钥的电脑数大于Microsoft软件许可条款允许的电脑数时,该密钥...

新机怎么激活windows10(新机怎么激活电池)
  • 新机怎么激活windows10(新机怎么激活电池)
  • 新机怎么激活windows10(新机怎么激活电池)
  • 新机怎么激活windows10(新机怎么激活电池)
  • 新机怎么激活windows10(新机怎么激活电池)
u盘文件恢复软件免费(恢复u盘数据免费的软件)
u盘文件恢复软件免费(恢复u盘数据免费的软件)

u盘损坏文件恢复方法:1、打开电脑桌面的“计算机”或“我的电脑”。2、然后再找到需要修复的u盘。3、打开“运行”窗口(可以直接按“Windows+R”快捷打开),输入“CMD”并点击“确定”按钮以进入命令提符界面。4、从打开的“命令提示符”...

2025-12-28 22:03 off999

win10蓝屏代码大全以及解决方法
  • win10蓝屏代码大全以及解决方法
  • win10蓝屏代码大全以及解决方法
  • win10蓝屏代码大全以及解决方法
  • win10蓝屏代码大全以及解决方法
电脑uac是什么意思

UAC就是用户帐户控制,在对计算机进行更改之前,用户帐户控制(UAC)会通知您。比如安装软件驱动什么的,默认UAC设置会在程序尝试对计算机进行更改时通知您,但您可以通过调整设置来控制UAC...

笔记本找不到自己家的wifi怎么办

1.笔记本电脑缺少无线网卡驱动,需要下载驱动如果笔记本电脑开机之后,无法显示WiFi网络的图标,这个时候多半是因为电脑缺少无线网卡驱动造成的,有时候自己在清理电脑的时候,不小心清理了驱动程序,便会...

电信宽带办理电话是多少(电信宽带办理联系电话)

电信宽带不一定需要电信手机号码,可以根据自身需要选择,有单独的宽带业务,一般要求预存一定时间的使用费。不过一般包含了宽带、手机号码的融合套餐总体上更优惠,对客户来说更划算。如果有相应需求的话,建议同时...

开机进入ghost启动项(电脑启动进入ghost)

电脑启动的时候进入GHOST界面方法:  1、首先确认电脑装了GHOST软件。  2、重启电脑,注意仔细观察电脑屏幕,会有一个3s或者10s的选择界面。让选择是进入GHOST界面,或者正常启动进入系...

华硕bios修复蓝屏图解(华硕bios修复蓝屏视频教程)

先看下BIOS是否可以识别到硬盘设备,若看不到,硬盘故障的可能性很大。若可以看到硬盘,建议先尝试进行BIOS兼容性设置:1,在BIOS界面,通过方向键进【Secure】菜单,通过方向键选择【Sec...

老电脑怎么装win7系统(老电脑装win7系统可以吗)

6年前的电脑,如果是用的当时最新的CPU的话,应该是第7代或者第6代酷睿等级的。运行windows7和windows10都应该没有压力。从软件的兼容性来说,还是建议安装windows10,因为现在有好...

电脑怎么设置到点自动关机(电脑怎样设置到点关机)

1、首先我们点击电脑屏幕左下角的开始按钮,在所有程序里依次选择附件---系统工具,接着打开任务计划程序。2、我们打开任务计划程序后,在最右边的操作框里选择创建基本任务,然后在创建基本任务对话框的名称一...

2025年笔记本电脑排行榜(20201年笔记本电脑推荐)

2023华为笔记本电脑matebook16系列很好用的。因为这个系列她是有非常好的性价,比的是能够让你有非常轻薄的厚度,并且能够有11.6寸的屏幕,而且还有120赫兹的刷新率作为大学生,您可能需要经常...

powerpoint激活密钥(ppt密钥 激活码2010)

1/4进入文件打开一个PPT文件进入到软件界面,在界面左上方找到文件选项,点击该选项进入到文件页面。2/4点击账户文件页面中,页面左侧找到账户选项,点击该选项,页面右侧会出现相应的操作选择。3/4点击...

取消回复欢迎 发表评论: