Python实现八大排序算法,具体内容如下

1、插入排序

描述

插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。

代码实现

definsert_sort(lists):#插入排序

count =len(lists)for i in range(1, count):

key=lists[i]

j= i - 1

while j >=0:if lists[j] >key:

lists[j+ 1] =lists[j]

lists[j]=key

j-= 1

return lists

2、希尔排序描述

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

代码实现

defshell_sort(lists):#希尔排序

count =len(lists)

step= 2group= count /stepwhile group >0:for i inrange(0, group):

j= i +groupwhile j

k= j -group

key=lists[j]while k >=0:if lists[k] >key:

lists[k+ group] =lists[k]

lists[k]=key

k-=group

j+=group

group/=stepreturn lists

3、冒泡排序描述

它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

代码实现

defbubble_sort(lists):#冒泡排序

count =len(lists)for i inrange(0, count):for j in range(i + 1, count):if lists[i] >lists[j]:

lists[i], lists[j]=lists[j], lists[i]return lists

4、快速排序描述

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

代码实现

defquick_sort(lists, left, right):#快速排序

if left >=right:returnlists

key=lists[left]

low=left

high=rightwhile left =key:

right-= 1lists[left]=lists[right]while left < right and lists[left] <=key:

left+= 1lists[right]=lists[left]

lists[right]=key

quick_sort(lists, low, left- 1)

quick_sort(lists, left+ 1, high)return lists

5、直接选择排序描述

基本思想:第1趟,在待排序记录r1 ~ r[n]中选出最小的记录,将它与r1交换;第2趟,在待排序记录r2 ~ r[n]中选出最小的记录,将它与r2交换;以此类推,第i趟在待排序记录r[i] ~ r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。

代码实现

defselect_sort(lists):#选择排序

count =len(lists)for i inrange(0, count):

min=ifor j in range(i + 1, count):if lists[min] >lists[j]:

min=j

lists[min], lists[i]=lists[i], lists[min]return lists

6、堆排序描述

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。

代码实现

#调整堆

defadjust_heap(lists, i, size):

lchild= 2 * i + 1rchild= 2 * i + 2max=iif i < size / 2:if lchild < size and lists[lchild] >lists[max]:

max=lchildif rchild < size and lists[rchild] >lists[max]:

max=rchildif max !=i:

lists[max], lists[i]=lists[i], lists[max]

adjust_heap(lists, max, size)#创建堆

defbuild_heap(lists, size):for i in range(0, (size/2))[::-1]:

adjust_heap(lists, i, size)#堆排序

defheap_sort(lists):

size=len(lists)

build_heap(lists, size)for i in range(0, size)[::-1]:

lists[0], lists[i]=lists[i], lists[0]

adjust_heap(lists, 0, i)

7、归并排序描述

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。

代码实现

defmerge(left, right):

i, j=0, 0

result=[]while i < len(left) and j

result.append(left[i])

i+= 1

else:

result.append(right[j])

j+= 1result+=left[i:]

result+=right[j:]returnresultdefmerge_sort(lists):#归并排序

if len(lists) <= 1:returnlists

num= len(lists) / 2left=merge_sort(lists[:num])

right=merge_sort(lists[num:])return merge(left, right)

8、基数排序描述

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

代码实现

importmathdef radix_sort(lists, radix=10):

k=int(math.ceil(math.log(max(lists), radix)))

bucket= [[] for i inrange(radix)]for i in range(1, k+1):for j inlists:

bucket[j/(radix**(i-1)) % (radix**i)].append(j)dellists[:]for z inbucket:

lists+=zdelz[:]return lists

以上就是Python实现八大排序算法的详细介绍。

python八大排序算法_Python实现八大排序算法相关推荐

  1. python实现排序算法_python实现各种排序算法

    冒泡排序 """ 分析 1. 算法是一种与语言无关的东西,更确切地说就算解决问题的思路,就是一个通用的思想的问题 2. 冒泡算法作为最简单的一种排序算法,我们的关注点不应 ...

  2. python的十大算法_Python十大排序算法

    代码如下: 快排 ''' 几乎是我们学习排序入门算法了,两次遍历,时间复杂度较高n*n,稳定排序 ''' def bubbleSort(tmpList): for i in range(len(tmp ...

  3. python决策树分类案例_python实现决策树分类算法

    本文实例为大家分享了python实现决策树分类算法的具体代码,供大家参考,具体内容如下 1.概述 决策树(decision tree)--是一种被广泛使用的分类算法. 相比贝叶斯算法,决策树的优势在于 ...

  4. python数圈算法_Python实现随机爬山算法

    随机爬山是一种优化算法.它利用随机性作为搜索过程的一部分.这使得该算法适用于非线性目标函数,而其他局部搜索算法不能很好地运行.它也是一种局部搜索算法,这意味着它修改了单个解决方案并搜索搜索空间的相对局 ...

  5. pythonopencv算法_python opencv之SURF算法示例

    本文介绍了python opencv之SURF算法示例,分享给大家,具体如下: 目标: SURF算法基础 opencv总SURF算法的使用 原理: 上节课使用了SIFT算法,当时这种算法效率不高,需要 ...

  6. python 代码排布_python实现经典排序算法的示例代码

    以下排序算法最终结果都默认为升序排列,实现简单,没有考虑特殊情况,实现仅表达了算法的基本思想. 冒泡排序 内层循环中相邻的元素被依次比较,内层循环第一次结束后会将最大的元素移到序列最右边,第二次结束后 ...

  7. python实现希尔排序算法_python实现希尔排序算法

    希尔排序是插入排序的一种又称"缩小增量排序",是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法 ...

  8. python字典排序方法_Python字典的排序方法一则

    今天需要对Python的字典进行排序,以获得有效的时间序列,采用了如下方法: 首先生成一个示例字典: >>> range_a = random.sample(range(0, 10) ...

  9. python寻峰算法_python/scipy的寻峰算法

    我可以自己写一些东西,通过找到一阶导数的零交叉点或其他东西,但它似乎是一个足够通用的函数,可以包含在标准库中.有人知道吗? 我的特殊应用是一个二维数组,但通常它会用于在FFT等中查找峰值. 具体地说, ...

  10. python实现堆排序算法_Python实现的堆排序算法示例

    本文实例讲述了Python实现的堆排序算法.分享给大家供大家参考,具体如下: 堆排序的思想:堆是一种数据结构,可以将堆看作一棵完全二叉树,这棵二叉树满足,任何一个非叶节点的值都不大于(或不小于)其左右 ...

最新文章

  1. INTERSECT/EXCEPT VS. IN/NOT IN
  2. hdoj2553(N皇后问题)
  3. python相关知识介绍一种理财方法_我是如何使用python来确定理财策略的
  4. SpringBoot2.0整合Mybatis-Plus多数据源
  5. linux需要多少空间安装mysql_如何安装MySQL
  6. 《算法与数据结构---C语言描述》优先队列
  7. [logstash-input-log4j]插件使用详解
  8. python 直播源_直播源获取软件下载|直播源获取工具(斗鱼B站西瓜)下载-蛙扑下载站...
  9. HarmonyOS Sans - 华为把鸿蒙系统自带的字体开放给全社会免费商用了
  10. JRtplib开发笔记(一):JRtplib简介、JThread库编译
  11. 【人话版】WEB3黑暗森林中的隐私博弈
  12. 怎么对linux系统的硬盘检测,详解Linux系统中hdparm硬盘检测工具的使用
  13. 杨柳絮-Info:太原市多部门通力合作科学治理杨柳飞絮效果好
  14. php快递100查询,php采集快递100的快递查询api
  15. web前端开发工程师的三种级别,技术决定你能拿5K,还是15K,还是25K
  16. 大学计算机教程内容,大学计算机基础教程(教程).ppt
  17. 南京申瓯SOC1000-UC IPPBX为中小企业提供电话系统解决方案
  18. 全球围剿下,苹果还能挺多久?
  19. 如何设置目录页码格式和正文页码格式不一样
  20. 联想Think Server TS540/440蓝屏故障处理

热门文章

  1. 手写原笔迹电子签名的原理及实现方法
  2. 支持有道词典单词本更新
  3. 魔鬼数学——大数据时代,数学思维的力量
  4. 怎么修改探索者服务器地址,探索者可不可以修改快捷键???
  5. 麒麟系统更改SSH端口号
  6. 2022年全栈开发者需要熟悉了解的知识列表
  7. ubuntu 命令行 ocr 双层pdf OCRmyPDF
  8. winform安装包签名
  9. 非极大值抑制(PyTorch-YOLOv3代码解析一)
  10. cad迷你画图2020中文版