时间:2020-10-08来源:www.pcxitongcheng.com作者:电脑系统城
1.顺序查找
当数据存储在诸如列表的集合中时,我们说这些数据具有线性或顺序关系。 每个数据元素都存储在相对于其他数据元素的位置。 由于这些索引值是有序的,我们可以按顺序访问它们。 这个过程产实现的搜索即为顺序查找。
顺序查找原理剖析:从列表中的第一个元素开始,我们按照基本的顺序排序,简单地从一个元素移动到另一个元素,直到找到我们正在寻找的元素或遍历完整个列表。如果我们遍历完整个列表,则说明正在搜索的元素不存在。
代码实现:该函数需要一个列表和我们正在寻找的元素作为参数,并返回一个是否存在的布尔值。found 布尔变量初始化为 False,如果我们发现列表中的元素,则赋值为 True。
?1 2 3 4 5 6 7 8 9 10 |
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 个元素需要进行比较。
二分查找则是从中间元素开始,而不是按顺序查找列表。 如果该元素是我们正在寻找的元素,我们就完成了查找。 如果它不是,我们可以使用列表的有序性质来消除剩余元素的一半。
如果我们正在查找的元素大于中间元素,就可以消除中间元素以及比中间元素小的一半元素。如果该元素在列表中,肯定在大的那半部分。然后我们可以用大的半部分重复该过程,继续从中间元素开始,将其与我们正在寻找的内容进行比较。
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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.冒泡排序
原理:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
1 2 3 4 5 6 |
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.选择排序
工作原理:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
?1 2 3 4 5 6 7 8 |
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.插入排序
原理:
基本思想是,每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。关键码是数据元素中某个数据项的值,用它可以标示一个数据元素。
?1 2 3 4 5 6 7 8 9 10 |
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)”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率比直接插入排序有较大提高。
?1 2 3 4 5 6 7 8 9 10 11 12 |
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.快速排序
基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
?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 30 31 |
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实现七个基本算法的实例代码的文章就介绍到这了,
2023-03-17
python flask项目打包成docker镜像发布的过程2023-03-17
python调试模块ipdb详解2023-03-17
python使用openai生成图像的超详细教程python cron定时任务触发接口自动化巡检 apscheduler报错:Run time of job …… next run at: ……)” was missed by misfire_grace_time参数 找到任务超时的根本原因...
2023-03-15