问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

python包含什么算法

发布网友 发布时间:2022-04-25 05:54

我来回答

2个回答

懂视网 时间:2022-04-29 11:01

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 = i
  current = arr[i]
  # 元素与他同列的前面的每个元素比较,如果比前面的小则互换
  while j - gap >= 0 and current < arr[j - gap]:
  arr[j] = arr[j - gap]
  j -= gap
  arr[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 randint
def 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 randint
def 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,random
def 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视频教程

热心网友 时间:2022-04-29 08:09

Python基础算法有哪些?
1.
冒泡排序:是一种简单直观的排序算法。重复地走访过要排序的数列,一次比较两个元素,如果顺序错误就交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该排序已经完成。
2.
插入排序:没有冒泡排序和选择排序那么粗暴,其原理最容易理解,插入排序是一种最简单直观的排序算法啊,它的工作原理是通过构建有序序列,对于未排序数据在已排序序列中从后向前排序,找到对应位置。
3.
希尔排序:也被叫做递减增量排序方法,是插入排序的改进版本。希尔排序是基于插入排序提出改进方法的排序算法,先将整个待排序的记录排序分割成为若干个子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再对全记录进行依次直接插入排序。
4. 归并排序:是建立在归并操作上的一种有效的排序算法。该算法是采用分治法Divide and的一个非常典型的应用。
5. 快速排序:由东尼·霍尔所发展的一种排序算法。又是一种分而治之思想在排序算法上的典型应用,本质上快速排序应该算是冒泡排序基础上的递归分治法。
6.
堆排序:是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质,即子结点的键值或索引总是小于它的父结点。
7.
计算排序:其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中,作为一种线性时间复杂度的排序,计算排序要求输入的数据必须是具有确定范围的整数。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么来大姨妈胸会胀 少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... 什么是年费啊 百度实名认证服务年费?投诉到315有用吗 百度竞价现在除了缴纳开户费还需要年费? 成为百度年费会员,在文库里下载是不是不受限制? 怎么购买百度百科年费? 百度网盘年费交了就只能用一年吗? 百度交年费可以不受限制下载所需文件吗? 求问百度信用卡年费问题! 在百度推广需要交多少年费 ? 百度运营账户管理年费属于什么费用? 百度网盘10t 年费多少钱 百度推广收点击费还要收年费合理吗? 百度推广老户新开还要缴费年审600元费用,加上年费不600这样就是1200元 百度网盘存东西越多年费越高吗 百度付年费怎么 百度推广年费应该是多少 手机PUK码是什么? 手机动态码是什么意思 手机3码、5码是什么意思 怎么知道我手机的IMSI码是多少? python中算法是干什么用的 什么是Python科学计算? Python贪心算法 python核心算法有哪些 什么压缩软件,什么格式可以把WORD、excel之类的文档压的最小? 使用python贪心算法和蛮力算法解决问题~~ Python算法编程 有哪些用 Python 语言讲算法和数据结构的书 专科考研难度大吗? 专科生考研难度高不高? 专科考研难度有多大,我是一个专科生,比较害怕? 专科生考研几率有多大? 护肤霜和面霜的区别 专升本和专科研究生哪个好考? 护肤霜是面霜吗 专科毕业在职考研难度大不大,具体难在哪? 面霜在护肤品中处于什么地位?多大年纪就可以用面霜了? 考研难吗对于专科生 面霜是什么东西 专科考研难度是不是很大?