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

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

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

相关推荐

Python设计模式 第 13 章 中介者模式(Mediator Pattern)

在行为型模式中,中介者模式是解决“多对象间网状耦合”问题的核心模式。它就像“机场调度中心”——多个航班(对象)无需直接沟通起飞、降落时间,只需通过调度中心(中介者)协调,避免航班间的冲突与混乱...

1.3.1 python交互式模式的特点和用法

什么是Python交互模式Python交互模式,也叫Python交互式编程,是一种在Python解释器中运行的模式,它允许用户在解释器窗口中输入单个Python语句,并立即查看结果,而不需要编写整个程...

Python设计模式 第 8 章 装饰器模式(Decorator Pattern)

在结构型模式中,装饰器模式是实现“动态功能扩展”的核心模式。它就像“手机壳与手机的关系”——手机(原始对象)具备通话、上网等基础功能,手机壳(装饰器)可在不改变手机本身的前提下,为其新增保护、...

python设计模式 综合应用与实战指南

经过前面16章的学习,我们已系统掌握创建型模式(单例、工厂、建造者、原型)、结构型模式(适配器、桥接、组合、装饰器、外观、享元、代理)、行为型模式(责任链、命令、迭代器、中介者、观察者、状态、策略...

Python入门学习教程:第 16 章 图形用户界面(GUI)编程

16.1什么是GUI编程?图形用户界面(GraphicalUserInterface,简称GUI)是指通过窗口、按钮、菜单、文本框等可视化元素与用户交互的界面。与命令行界面(CLI)相比,...

Python 中 必须掌握的 20 个核心:str()

str()是Python中用于将对象转换为字符串表示的核心函数,它在字符串处理、输出格式化和对象序列化中扮演着关键角色。本文将全面解析str()函数的用法和特性。1.str()函数的基本用法1.1...

Python偏函数实战:用functools.partial减少50%重复代码的技巧

你是不是经常遇到这样的场景:写代码时同一个函数调用了几十次,每次都要重复传递相同的参数?比如处理文件时总要用encoding='utf-8',调用API时固定传Content-Type...

第2节.变量和数据类型【第29课-输出总结】

同学们,关于输出的知识点讲解完成之后,把重点性的知识点做一个总结回顾。·首先对于输出这一章节讲解的比如有格式化符号,格式化符号这里需要同学们额外去多留意的是不是百分号s格式化输出字符串。当然课上也说百...

AI最火语言python之json操作_python json.loads()

JSON(JavaScriptObjectNotation,JavaScript对象表示法)是一种开放标准的文件格式和数据交换格式,它易于人阅读和编写。JSON是一种常用的数据格式,比如对接各种第...

python中必须掌握的20个核心函数—split()详解

split()是Python字符串对象的方法,用于将字符串按照指定的分隔符拆分成列表。它是文本处理中最常用的函数之一。一、split()的基本用法1.1基本语法str.split(sep=None,...

实用方法分享:pdf文件分割方法 横向A3分割成纵向A4

今天在街上打印店给儿子打印试卷时,我在想:能不能,把它分割成A4在家中打印,这样就不需要跑到街上的打印店打印卷子了。原来,老师发的作业,是电子稿,pdf文件,A3格式的试卷。可是家中的打印机只能打印A...

20道常考Python面试题大总结_20道常考python面试题大总结免费

20道常考Python面试题大总结关于Python的面试经验一般来说,面试官会根据求职者在简历中填写的技术及相关细节来出面试题。一位拿了大厂技术岗SpecialOffer的网友分享了他总结的面试经...

Kotlin Data Classes 快速上手_kotlin快速入门

引言在日常开发中,我们常常需要创建一些只用来保存数据的类。问题是,这样的类往往需要写一堆模板化的方法:equals()、hashCode()、toString()……每次都重复,既枯燥又容易出错。//...

python自动化RobotFramework中Collections字典关键字使用(五)

前言介绍安装好robotframework库后,跟之前文章介绍的BuiltIn库一样BuiltIn库使用介绍,在“python安装目录\Lib\site-packages\robot\librarie...

Python中numpy数据分析库知识点总结

Python中numpy数据分析库知识点总结二、对已读取数据的处理②指定一个值,并对该值双边进行修改③指定两个值,并对第一个值的左侧和第二个值的右侧进行修改2.4数组的拼接和行列交换①竖直拼接(np...

取消回复欢迎 发表评论: