python语言中有算法吗

作者:silencement 时间:2022-06-22 12:42:15 

了解算法之前,我们先看一下什么是算法

定义:算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

python中的常见算法

冒泡排序

效率:O(n2)

原理:

比较相邻的元素,如果第一个比第二个大,就交换他们两个;

对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。做完以后,最后的元素会是最大的数,这里可以理解为走了一趟;

针对所有的元素重复以上的步骤,除了最后一个;

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较,最后数列就是从大到小一次排列;


def bubble_sort(data):
 """
 冒泡排序
 :param data:
 :return:
 """
 for i in range(len(data)-1): # 趟数
   for j in range(len(data)-i-1): # 遍历数据,依次交换
     if data[j]>data[j+1]: # 当较大数在前面
       data[j],data[j+1]=data[j+1],data[j] #交换两个数的位置

if __name__=='__main__':
 import random
 data_list=list(range(30))
 random.shuffle(data_list)
 print("pre:",data_list)
 bubble_sort(data_list)
 print("after:",data_list)
#结果:
#pre: [22, 11, 19, 16, 12, 18, 20, 28, 27, 4, 21, 10, 9, 7, 1, 6, 5, 29, 8, 0, 17, 26, 13, 14, 15, 24, 25, 23, 3, 2]
#after: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]

选择排序

效率:O(n2)

原理:

每一次从待排序的列表中选出一个元素,并将其与其他数依次比较,若列表中的某个数比选中的数小,则交换位置,把所有数比较完毕,则会选出最小的数,将其放在最左边(这一过程称为一趟);

重复以上步骤,直到全部待排序的数据元素排完;

demo:


def select_sort(data):
 """
 选择排序
 :param data: 待排序的数据列表
 :return:
 """
 for i in range(len(data)-1): #趟数
   min_index=i # 记录i趟开始最小的数的索引,我们从最左边开始
   for j in range(i+1,len(data)): # 每一次趟需要循环的次数
     if data[j] < data[min_index]: # 当数列中的某一个数比开始的数要小时候,更新最小值索引位置
       min_index=j
   data[i],data[min_index]=data[min_index],data[i] # 一趟走完,交换最小值的位置,第一趟最小
if __name__=='__main__':
 import random
 data_list=list(range(30))
 random.shuffle(data_list) # 打乱列表数据
 print("pre:",data_list)
 select_sort(data_list)
 print("after:",data_list)
#结果:
#pre: [20, 11, 22, 0, 18, 21, 14, 19, 7, 23, 27, 29, 24, 4, 17, 15, 5, 10, 26, 13, 25, 1, 8, 16, 3, 9, 2, 28, 12, 6]
#after: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]

插入排序

效率:O(n2)

原理:

以从小到大排序为例,元素0为第一个元素,插入排序是从元素1开始,尽可能插到前面。

插入时分插入位置和试探位置,元素i的初始插入位置为i,试探位置为i-1,在插入元素i时,依次与i-1,i-2······元素比较,如果被试探位置的元素比插入元素大,那么被试探元素后移一位,元素i插入位置前移1位,直到被试探元素小于插入元素或者插入元素位于第一位。

重复上述步骤,最后完成排序

demo:


def insert_sort(data):
 """
 插入排序
 :param data: 待排序的数据列表
 :return:
 """
 for i in range(1, len(data)): # 无序区域数据
   tmp = data[i] # 第i次插入的基准数
   for j in range(i, -1, -1):
     if tmp < data[j - 1]: # j为当前位置,试探j-1位置
       data[j] = data[j - 1] # 移动当前位置
     else: # 位置确定为j
       break
   data[j] = tmp # 将当前位置数还原

if __name__=='__main__':
 import random
 data_list=list(range(30))
 random.shuffle(data_list) # 打乱列表数据
 print("pre:",data_list)
 insert_sort(data_list)
 print("after:",data_list)
#结果:
#pre: [7, 17, 10, 16, 23, 24, 13, 11, 2, 5, 15, 29, 27, 18, 4, 19, 1, 9, 3, 21, 0, 14, 12, 25, 22, 28, 20, 6, 26, 8]
#after: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]

堆排序

堆定义:本质是一个完全二叉树,如果根节点的值是所有节点的最小值称为小根堆,如果根节点的值是所有节点的最大值,称为大根堆。

效率:O(nlogn)

原理:

将待排序数据列表建立成堆结构(建立堆);

通过上浮(shift_up)或下沉(shift_down)等操作得到堆顶元素为最大元素(已大根堆为例);

去掉堆顶元素,将最后的一个元素放到堆顶,重新调整堆,再次使得堆顶元素为最大元素(相比第一次为第二大元素);

重复3操作,直到堆为空,最后完成排序;

归并排序

效率:O(nlogn)

空间复杂度:O(n)

原理:

申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;

设定两个指针,最初位置分别为两个已经排序序列的起始位置;

比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;

重复步骤3直到某一指针达到序列尾;

将另一序列剩下的所有元素直接复制到合并序列尾。

来源:https://www.py.cn/faq/python/11867.html

标签:python,算法
0
投稿

猜你喜欢

  • 用python脚本24小时刷浏览器的访问量方法

    2022-07-16 18:21:33
  • Mysql查询语句优化技巧

    2024-01-19 15:41:08
  • python-字典dict和集合set

    2021-09-30 10:10:17
  • Python实现基于SVM的分类器的方法

    2023-11-18 18:20:02
  • keras中epoch,batch,loss,val_loss用法说明

    2021-08-11 10:56:30
  • 详解设计模式中的工厂方法模式在Python程序中的运用

    2022-11-14 01:06:58
  • Python定义函数实现累计求和操作

    2021-07-07 00:54:19
  • python文件操作之批量修改文件后缀名的方法

    2023-05-10 15:57:06
  • php将文件夹打包成zip文件的简单实现方法

    2024-05-11 09:48:14
  • 从0到1构建vueSSR项目之node以及vue-cli3的配置

    2024-04-27 16:06:59
  • MySQL多表查询的具体实例

    2024-01-22 00:13:20
  • python中OrderedDict的使用方法详解

    2023-08-26 14:00:40
  • 一文详细聊聊vue3的defineProps、defineEmits和defineExpose

    2024-04-27 16:02:10
  • oracle删除表字段和oracle表增加字段

    2023-07-16 10:52:18
  • Python多线程threading模块用法实例分析

    2022-01-04 05:10:32
  • python 使用pandas计算累积求和的方法

    2021-05-22 19:46:16
  • Python使用docx模块处理word文档流程详解

    2023-03-08 15:45:06
  • PyQt5 在label显示的图片中绘制矩形的方法

    2021-02-02 08:50:45
  • mysql删除表中某一字段重复的记录

    2024-01-22 10:35:43
  • Python爬虫实例爬取网站搞笑段子

    2022-11-29 17:14:33
  • asp之家 网络编程 m.aspxhome.com