Python实现七个基本算法的实例代码


Posted in Python onOctober 08, 2020

1.顺序查找

当数据存储在诸如列表的集合中时,我们说这些数据具有线性或顺序关系。 每个数据元素都存储在相对于其他数据元素的位置。 由于这些索引值是有序的,我们可以按顺序访问它们。 这个过程产实现的搜索即为顺序查找。

顺序查找原理剖析:从列表中的第一个元素开始,我们按照基本的顺序排序,简单地从一个元素移动到另一个元素,直到找到我们正在寻找的元素或遍历完整个列表。如果我们遍历完整个列表,则说明正在搜索的元素不存在。

代码实现:该函数需要一个列表和我们正在寻找的元素作为参数,并返回一个是否存在的布尔值。found 布尔变量初始化为 False,如果我们发现列表中的元素,则赋值为 True。

def search(alist,item):
 find = False
 cur = 0
 while cur < len(alist):
 if alist[cur] == item:
  find = True
  break
 else:
  cur += 1
 return find

2.二分查找

有序列表对于我们的实现搜索是很有用的。在顺序查找中,当我们与第一个元素进行比较时,如果第一个元素不是我们要查找的,则最多还有 n-1 个元素需要进行比较。

二分查找则是从中间元素开始,而不是按顺序查找列表。 如果该元素是我们正在寻找的元素,我们就完成了查找。 如果它不是,我们可以使用列表的有序性质来消除剩余元素的一半。

如果我们正在查找的元素大于中间元素,就可以消除中间元素以及比中间元素小的一半元素。如果该元素在列表中,肯定在大的那半部分。然后我们可以用大的半部分重复该过程,继续从中间元素开始,将其与我们正在寻找的内容进行比较。

def search(alist,item):
 left = 0
 right = len(alist) - 1
 find = False

 while left <= right:
 mid_index = (left + right)//2
 if item == alist[mid_index]:
  find = True
  break
 else:
  if item > alist[mid_index]:
  left = mid_index + 1
  else:
  right = mid_index -1

 return find

3.冒泡排序

原理:

比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

Python实现七个基本算法的实例代码

def sort(alist):
 length = len(alist)
 for i in range(0,length-1):
  for j in range(0,length-1-i):
  if alist[i] > alist[i+1]:
   alist[i],alist[i+1] = alist[i+1],alist[i]

4.选择排序

工作原理:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

Python实现七个基本算法的实例代码

def sort(alist):
 length = len(alist)
 for j in range(length-1,0,-1):
 max_index = 0
 for i in range(1,j+1):
  if alist[max_index] < alist[i]:
  max_index = i
 alist[max_index],alist[j] = alist[j],alist[max_index]

5.插入排序

原理:

基本思想是,每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。关键码是数据元素中某个数据项的值,用它可以标示一个数据元素。

Python实现七个基本算法的实例代码

def sort(alist):
 length = len(alist)
 for j in range(1,length):
 i = j
 while i > 0:
  if alist[i] < alist[i-1]:
  alist[i],alist[i-1] = alist[i-1],alist[i]
  i -= 1
  else:
  break

希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。

该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量(gap)”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率比直接插入排序有较大提高。

def sort(alist):
 gap = len(alist)//2
 while gap >= 1:
 for j in range(gap,len(alist)):
  i = j
  while i > 0:
  if alist[i] < alist[i-gap]:
   alist[i],alist[i-gap] = alist[i-gap],alist[i]
   i -= gap
  else:
   break
 gap = gap // 2

6.快速排序

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

Python实现七个基本算法的实例代码

def sort(alist,start,end):
 low = start
 high = end
 if low >= high:
 return
 mid = alist[low]
 while low < high:
 while low < high:
  if alist[high] >= mid:
  high -= 1
  else:
  alist[low] = alist[high]
  break
 while low < high:
  if alist[low] < mid:
  low += 1
  else:
  alist[high] = alist[low]
  break
 alist[low] = mid
 sort(alist,start,low-1)
 sort(alist,high+1,end)

7.归并排序

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

Python实现七个基本算法的实例代码

def merge_sort(alist):
 n = len(alist)
 #结束递归的条件
 if n <= 1:
 return alist
 #中间索引
 mid = n//2

 left_li = merge_sort(alist[:mid])
 right_li = merge_sort(alist[mid:])

 #指向左右表中第一个元素的指针
 left_pointer,right_pointer = 0,0
 #合并数据对应的列表:该表中存储的为排序后的数据
 result = []
 while left_pointer < len(left_li) and right_pointer < len(right_li):
 #比较最小集合中的元素,将最小元素添加到result列表中
 if left_li[left_pointer] < right_li[right_pointer]:
  result.append(left_li[left_pointer])
  left_pointer += 1
 else:
  result.append(right_li[right_pointer])
  right_pointer += 1
 #当左右表的某一个表的指针偏移到末尾的时候,比较大小结束,将另一张表中的数据(有序)添加到result中
 result += left_li[left_pointer:]
 result += right_li[right_pointer:]

 return result

alist = [3,8,5,7,6]
print(merge_sort(alist))

8.各个算法的时间复杂度

Python实现七个基本算法的实例代码

到此这篇关于Python实现七个基本算法的实例代码的文章就介绍到这了,更多相关Python基本算法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python目录操作之python遍历文件夹后将结果存储为xml
Jan 27 Python
在Python中使用异步Socket编程性能测试
Jun 25 Python
Python中类型检查的详细介绍
Feb 13 Python
Python 利用内置set函数对字符串和列表进行去重的方法
Jun 29 Python
numpy添加新的维度:newaxis的方法
Aug 02 Python
对Django中的权限和分组管理实例讲解
Aug 16 Python
python 中不同包 类 方法 之间的调用详解
Mar 09 Python
Python基于BeautifulSoup爬取京东商品信息
Jun 01 Python
Python+OpenCV图像处理——实现轮廓发现
Oct 23 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
Feb 06 Python
python利用pandas分析学生期末成绩实例代码
Jul 09 Python
python三子棋游戏
May 04 Python
python自动化测试三部曲之request+django实现接口测试
Oct 07 #Python
python自动化测试三部曲之unittest框架的实现
Oct 07 #Python
浅谈anaconda python 版本对应关系
Oct 07 #Python
简述python&amp;pytorch 随机种子的实现
Oct 07 #Python
详解基于python的全局与局部序列比对的实现(DNA)
Oct 07 #Python
python单元测试框架pytest的使用示例
Oct 07 #Python
利用python批量爬取百度任意类别的图片的实现方法
Oct 07 #Python
You might like
php去除头尾空格的2种方法
2015/03/16 PHP
4种PHP异步执行的常用方式
2015/12/24 PHP
laravel 验证错误信息到 blade模板的方法
2019/09/29 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
2020/01/26 PHP
动态加载脚本提升javascript性能
2014/02/24 Javascript
nodejs开发环境配置与使用
2014/11/17 NodeJs
seajs加载jquery时提示$ is not a function该怎么解决
2015/10/23 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
2016/05/20 Javascript
浅谈Angular4中常用管道
2017/09/27 Javascript
微信小程序学习笔记之本地数据缓存功能详解
2019/03/29 Javascript
解决vue单页面 回退页面 keeplive 缓存问题
2020/07/22 Javascript
Vue实现省市区三级联动
2020/12/27 Vue.js
Python连接PostgreSQL数据库的方法
2016/11/28 Python
python批量读取txt文件为DataFrame的方法
2018/04/03 Python
基于python的ini配置文件操作工具类
2019/04/24 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
2019/06/03 Python
PyQt5重写QComboBox的鼠标点击事件方法
2019/06/25 Python
tensorflow实现残差网络方式(mnist数据集)
2020/05/26 Python
Python爬虫之Spider类用法简单介绍
2020/08/04 Python
Homestay中文官网:全球寄宿家庭
2018/10/18 全球购物
成人大专生实习期的自我评价
2013/10/02 职场文书
多媒体编辑专业毕业生推荐信
2013/11/05 职场文书
收银员岗位职责
2014/02/07 职场文书
高等教育学自荐书范文
2014/02/10 职场文书
篮球兴趣小组活动总结
2014/07/07 职场文书
组织生活会发言材料
2014/12/15 职场文书
大学辅导员述职报告
2015/01/10 职场文书
单位接收函格式
2015/01/30 职场文书
业务员岗位职责
2015/02/03 职场文书
2015年国庆晚会主持词
2015/07/01 职场文书
python基础之函数的定义和调用
2021/10/24 Python
MySQL悲观锁与乐观锁的实现方案
2021/11/02 MySQL
2022年四月新番
2022/03/15 日漫
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
2022/04/24 Python
CSS中理解层叠性及权重如何分配
2022/12/24 HTML / CSS