侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python排序算法有哪些?

Python  /  管理员 发布于 7年前   214

python排序算法有哪些?下面本篇文章给大家介绍一下Python十大经典排序算法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

现在很多的事情都可以用算法来解决,在编程上,算法有着很重要的地位,将算法用函数封装起来,使程序能更好的调用,不需要反复编写。

Python十大经典算法:

一、插入排序

1.算法思想

从第二个元素开始和前面的元素进行比较,如果前面的元素比当前元素大,则将前面元素 后移,当前元素依次往前,直到找到比它小或等于它的元素插入在其后面,

然后选择第三个元素,重复上述操作,进行插入,依次选择到最后一个元素,插入后即完成所有排序。

2.代码实现

def insertion_sort(arr):    #插入排序    # 第一层for表示循环插入的遍数    for i in range(1, len(arr)):        # 设置当前需要插入的元素        current = arr[i]        # 与当前元素比较的比较元素        pre_index = i - 1        while pre_index >= 0 and arr[pre_index] > current:# 当比较元素大于当前元素则把比较元素后移arr[pre_index + 1] = arr[pre_index]# 往前选择下一个比较元素pre_index -= 1        # 当比较元素小于当前元素,则将当前元素插入在 其后面        arr[pre_index + 1] = current    return arr

二、选择排序

1.算法思想

设第一个元素为比较元素,依次和后面的元素比较,比较完所有元素找到最小的元素,将它和第一个元素互换,重复上述操作,我们找出第二小的元素和第二个位置的元素互换,以此类推找出剩余最小元素将它换到前面,即完成排序。

2.代码实现

def selection_sort(arr):    #选择排序    # 第一层for表示循环选择的遍数    for i in range(len(arr) - 1):        # 将起始元素设为最小元素        min_index = i        # 第二层for表示最小元素和后面的元素逐个比较        for j in range(i + 1, len(arr)):if arr[j] < arr[min_index]:    # 如果当前元素比最小元素小,则把当前元素角标记为最小元素角标    min_index = j        # 查找一遍后将最小元素与起始元素互换        arr[min_index], arr[i] = arr[i], arr[min_index]    return arr

三、冒泡排序

1.算法思想

从第一个和第二个开始比较,如果第一个比第二个大,则交换位置,然后比较第二个和第三个,逐渐往后,经过第一轮后最大的元素已经排在最后,

所以重复上述操作的话第二大的则会排在倒数第二的位置。,那重复上述操作n-1次即可完成排序,因为最后一次只有一个元素所以不需要比较。

2.代码实现

def bubble_sort(arr):    #冒泡排序    # 第一层for表示循环的遍数    for i in range(len(arr) - 1):        # 第二层for表示具体比较哪两个元素        for j in range(len(arr) - 1 - i):if arr[j] > arr[j + 1]:    # 如果前面的大于后面的,则交换这两个元素的位置    arr[j], arr[j + 1] = arr[j + 1], arr[j]    return arr

四、快速排序

1.算法思想

找出基线条件,这种条件必须尽可能简单,不断将问题分解(或者说缩小规模),直到符合基线条件。

2.代码实现

def quick_sort(arr):  if len(arr) < 2:    # 基线条件:为空或只包含一个元素的数组是“有序”的    return arr  else:    # 递归条件    pivot = arr[0]    # 由所有小于基准值的元素组成的子数组    less = [i for i in arr[1:] if i <= pivot]    # 由所有大于基准值的元素组成的子数组    greater = [i for i in array[1:] if i > pivot]    return quicksort(less) + [pivot] + quicksort(greater)print(quick_sort([10, 5, 2, 3]))

五、归并排序

1.算法思想

归并排序是分治法的典型应用。分治法(pide-and-Conquer):将原问题划分成 n 个规模较小而结构与原问题相似的子问题;递归地解决这些问题,然后再合并其结果,就得到原问题的解,分解后的数列很像一个二叉树。

具体实现步骤:

  1. 使用递归将源数列使用二分法分成多个子列

  2. 申请空间将两个子列排序合并然后返回

  3. 将所有子列一步一步合并最后完成排序

  4. 注:先分解再归并

2.代码实现

def merge_sort(arr):    #归并排序    if len(arr) == 1:        return arr    # 使用二分法将数列分两个    mid = len(arr) // 2    left = arr[:mid]    right = arr[mid:]    # 使用递归运算    return marge(merge_sort(left), merge_sort(right))def marge(left, right):    #排序合并两个数列    result = []    # 两个数列都有值    while len(left) > 0 and len(right) > 0:        # 左右两个数列第一个最小放前面        if left[0] <= right[0]:result.append(left.pop(0))        else:result.append(right.pop(0))    # 只有一个数列中还有值,直接添加    result += left    result += right    return result

六、希尔排序

1.算法思想

希尔排序的整体思想是将固定间隔的几个元素之间排序,然后再缩小这个间隔。这样到最后数列就成为了基本有序数列。

具体步骤:

  1. 计算一个增量(间隔)值

  2. 对元素进行增量元素进行比较,比如增量值为7,那么就对0,7,14,21…个元素进行插入排序

  3. 然后对1,8,15…进行排序,依次递增进行排序

  4. 所有元素排序完后,缩小增量比如为3,然后又重复上述第2,3步

  5. 最后缩小增量至1时,数列已经基本有序,最后一遍普通插入即可

2.代码实现

def shell_sort(arr):    #希尔排序    # 取整计算增量(间隔)值    gap = len(arr) // 2    while gap > 0:        # 从增量值开始遍历比较        for i in range(gap, len(arr)):j = icurrent = arr[i]# 元素与他同列的前面的每个元素比较,如果比前面的小则互换while j - gap >= 0 and current < arr[j - gap]:    arr[j] = arr[j - gap]    j -= gaparr[j] = current        # 缩小增量(间隔)值        gap //= 2    return arr

七、基数排序

1.算法思想

基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。

2.代码实现

2.1由桶排序改造,从最低位到最高位依次桶排序,最后输出最后排好的列表。

def RadixSort(list,d):    for k in range(d):#d轮排序        # 每一轮生成10个列表        s=[[] for i in range(10)]#因为每一位数字都是0~9,故建立10个桶        for i in list:# 按第k位放入到桶中s[i//(10**k)%10].append(i)        # 按当前桶的顺序重排列表        list=[j for i in s for j in i]    return list

2.2简单实现

from random import randintdef radix_sort():  A = [randint(1, 99999999) for _ in xrange(9999)]  for k in xrange(8):    S = [ [] for _ in xrange(10)]    for j in A:      S[j / (10 ** k) % 10].append(j)    A = [a for b in S for a in b]  for i in A:    print i

八、计数排序

1.算法思想

对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x 放在它在输出数组上的位置上了,运行时间为O(n),但其需要的空间不一定,空间浪费大。

2.代码实现

from numpy.random import randintdef Conuting_Sort(A):    k = max(A)          # A的最大值,用于确定C的长度    C = [0]*(k+1)       # 通过下表索引,临时存放A的数据    B = (len(A))*[0]    # 存放A排序完成后的数组    for i in range(0, len(A)):        C[A[i]] += 1    # 记录A有哪些数字,值为A[i]的共有几个    for i in range(1, k+1):        C[i] += C[i-1]  # A中小于i的数字个数为C[i]    for i in range(len(A)-1, -1, -1):        B[C[A[i]]-1] = A[i] # C[A[i]]的值即为A[i]的值在A中的次序        C[A[i]] -= 1    # 每插入一个A[i],则C[A[i]]减一    return B

九、堆排序

1.算法思想

堆分为最大堆和最小堆,是完全二叉树。堆排序就是把堆顶的最大数取出,将剩余的堆继续调整为最大堆,具体过程在第二块有介绍,以递归实现 ,

剩余部分调整为最大堆后,再次将堆顶的最大数取出,再将剩余部分调整为最大堆,这个过程持续到剩余数只有一个时结束。

2.代码实现

import time,randomdef sift_down(arr, node, end):    root = node    #print(root,2*root+1,end)    while True:        # 从root开始对最大堆调整        child = 2 * root +1  #left child        if child  > end:#print('break',)break        print("v:",root,arr[root],child,arr[child])        print(arr)        # 找出两个child中交大的一个        if child + 1 <= end and arr[child] < arr[child + 1]: #如果左边小于右边child += 1 #设置右边为大        if arr[root] < arr[child]:# 最大堆小于较大的child, 交换顺序tmp = arr[root]arr[root] = arr[child]arr[child]= tmp# 正在调整的节点设置为root#print("less1:", arr[root],arr[child],root,child)root = child ##[3, 4, 7, 8, 9, 11, 13, 15, 16, 21, 22, 29]#print("less2:", arr[root],arr[child],root,child)        else:# 无需调整的时候, 退出break    #print(arr)    print('-------------') def heap_sort(arr):    # 从最后一个有子节点的孩子还是调整最大堆    first = len(arr) // 2 -1    for i in range(first, -1, -1):        sift_down(arr, i, len(arr) - 1)    #[29, 22, 16, 9, 15, 21, 3, 13, 8, 7, 4, 11]    print('--------end---',arr)    # 将最大的放到堆的最后一个, 堆-1, 继续调整排序    for end in range(len(arr) -1, 0, -1):        arr[0], arr[end] = arr[end], arr[0]        sift_down(arr, 0, end - 1)        #print(arr)

十、桶排序

1.算法思想

为了节省空间和时间,我们需要指定要排序的数据中最小以及最大的数字的值,来方便桶排序算法的运算。

2.代码实现

#桶排序def bucket_sort(the_list):    #设置全为0的数组    all_list = [0 for i in range(100)]    last_list = []    for v in the_list:        all_list[v] = 1 if all_list[v]==0 else all_list[v]+1    for i,t_v in enumerate(all_list):        if t_v != 0:for j in range(t_v):    last_list.append(i)    return last_list

总结:

在编程中,算法都是相通的,算法重在算法思想,相当于将一道数学上的应用题的每个条件,区间,可能出现的结果进行分解,分步骤的实现它。算法就是将具体问题的共性抽象出来,将步骤用编程语言来实现。通过这次对排序算法的整理,加深了对各算法的了解,具体的代码是无法记忆的,通过对算法思想的理解,根据伪代码来实现具体算法的编程,才是真正了解算法。

推荐学习:Python视频教程

以上就是python排序算法有哪些?的详细内容,更多请关注其它相关文章!


  • 上一条:
    golang和python有什么区别?
    下一条:
    python如何求水仙花数?
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客