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

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

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

相关推荐

联想win7怎么进入bios设置(联想win7进入bios设置win10)
联想win7怎么进入bios设置(联想win7进入bios设置win10)

联想电脑win7进入bios设置的具体步骤如下: 1、首先我们打开电脑的同时,按下键盘上的“F2”。2、然后我们在弹出来的窗口中就可以进入到BIOS界面中。3、然后我们按下键盘上的“F10”,之后回车确定即可退出。联想电脑win7...

2025-11-09 14:03 off999

优盘里面的文件被误删了能否找回

如果您的文件在很久以前被误删并且没有进行任何操作,那么有可能通过一些专业的数据恢复工具来恢复被删除的文件。以下是一些可能的操作步骤:1.停止使用U盘:为了最大限度地提高恢复成功的几率,请停止使用U盘...

电脑系统程序下载(电脑应用程序下载)

1、首先下载并安装DriverDroid,运行后根据设置向导进行设置。2、然后注意安卓手机已获取ROOT,设置时需要连接电脑。3、将手机自动下载的bios文件移动到镜像根目录下(手机内存/Downlo...

万能网卡驱动离线安装包下载

电脑没网是吧,那你可以先用手机下载。之后放电脑上安装的万能网卡驱动下载地址http://drivers.160.com/universal/camera.html该驱动能够使大部分的网卡能够被系统...

正版office和盗版区别(office正版和盗版可以共存吗)

区别主要有三方面:1.office正版是付费的,而且价格相对而言较高,盗版呢价格相对低或者干脆免费。2.office正版因为是官方发行,文件肯定完整,功能齐全,稳定。盗版呢一般都是破译的或者是拷贝的,...

ヽ这个符号怎么打出来(这个符号怎么打出来是在中间的)

下载酷狗拼音,软键盘就有了。ˋ☆╲ヽ

120g固态硬盘够用吗(10几年的老电脑换个固态硬盘)

一般办公家用还是够用了,分两个区,系统盘分50G,剩余的分一个区做资料盘。特殊要求,资料文件比较多的话,128g是不够用,只能分一个区。这个主要取决于您电脑主要的用途,如果您的电脑只是用来日常办公和娱...

谷歌浏览器google(谷歌浏览器googleplay)

GoogleChrome,又称Google浏览器,是一个美国Google(谷歌)公司开发的网页浏览器。该浏览器是基于其他开源软件所撰写,包括WebKit,目标是提升稳定性、速度和安全性,并创造出简单且...

android13正式版下载(安卓版本13)

出现该问题的原因是,用户在设置里开启了新下载的APP,仅添加到APP资源库选项。大家只要进入“设置-主屏幕”,把新下载的APP,改为“添加到主屏幕”即可解决问题。修改完成后,你再进入AppStore下...

firefox浏览器安卓版(firefox浏览器安卓版 打开本地网页)

要进入火狐浏览器手机版的主页,你可以通过以下几种方式进行:首先,打开火狐浏览器App,然后点击右上角的三条横线菜单按钮,接着选择“主页”选项。另外,你也可以直接在浏览器地址栏中输入“about:hom...

电脑cpu性能排行榜天梯图(“电脑cpu性能天梯图”)

一、英特尔酷睿i7670。这款英特尔CPU采用的是超频新芯,最大程度的提升处理器的超频能力。二、英特尔酷睿i74790kCPU:这款CPU采用22纳米制程工艺的框架,它的默认频率是4.0到4.4Ghz...

硬盘怎么分区合理(硬盘怎么分区合理一点)
  • 硬盘怎么分区合理(硬盘怎么分区合理一点)
  • 硬盘怎么分区合理(硬盘怎么分区合理一点)
  • 硬盘怎么分区合理(硬盘怎么分区合理一点)
  • 硬盘怎么分区合理(硬盘怎么分区合理一点)
路由器怎么设置密码不被别人蹭网
  • 路由器怎么设置密码不被别人蹭网
  • 路由器怎么设置密码不被别人蹭网
  • 路由器怎么设置密码不被别人蹭网
  • 路由器怎么设置密码不被别人蹭网
电脑自由截屏的快捷键是什么

快捷键是ctrl+alt+a,我们可将聊天窗口缩小,放在旁边。然后找到想要截屏的位置,这时我们在截屏旁边,就更加的方便了。在键盘中按下PrintScreenSysRq(简写为PrtSc)键,此快捷...

windows10精简版官网下载(win10官方精简版下载)

精简版的意思的它比原版的功能和软件少了,其实精简版的更适合大众,没有多余的其他必要功能,更快Win10版本主要为四个分别是专业版、家庭版、企业版、教育版,其实除了这四个之外,还有工作站版、LTSB/L...

取消回复欢迎 发表评论: