python怎样实现排序算法?
Admin 2021-08-23 群英技术资讯 414 次浏览
python怎样实现排序算法?对于排序算法有冒泡排序、选择排序、插入排序和快速排序等,很多新手对于这些排序算法的实现可能不是很了解,对此,这篇文章就主要给大家分享排序算法的实现,感兴趣的朋友就继续往下看吧。
1.1 算法步骤:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
(1) 不管原始数组是否有序,时间复杂度都是O(n2)
(2) 空间复杂度是O(1)
(3) 冒泡排序是从最后一位开始确定最大或最小的数,保证后面的数都是有序的且都大于或小于前面的数
1.2 算法实现
def bubble_sort(alist): for i in range(len(alist) - 1): for j in range(len(alist) - 1 - i):##最后的几位已经确定好大小的不用再次参与排序 if alist[j] > alist[j + 1]: alist[j], alist[j + 1] = alist[j + 1], alist[j] count += 1 list = [3, 4, 2, 7, 11, 15, 5] bubble_sort(list) print(list)
1.3 算法优化
def bubble_sort(alist): for i in range(len(alist) - 1): count = 0 ## 记录交换的次数 for j in range(len(alist) - 1 - i): if alist[j] > alist[j + 1]: alist[j], alist[j + 1] = alist[j + 1], alist[j] count += 1 ## 如果此次遍历为未发生交换,则说明数据是有序的 if count == 0: return list = [3, 4, 2, 7, 11, 15, 5] bubble_sort(list) print(list)
2.1 算法步骤
2.2 算法实现
def select_sort(alist): for i in range(len(alist) - 1): min = i ## i之前的元素已经确定位置,假设第i个元素为最小值 for j in range(i, len(alist)): if alist[min] > alist[j]: ## 如果后面的元素比第i个元素小,则记录该元素的索引为最小元素的索引 min = j alist[i], alist[min] = alist[min], alist[i] list = [3, 4, 2, 7, 11, 15, 5] select_sort(list) print(list)
3.1 算法步骤
将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。
3.2 算法实现
def insert_sort(alist): for i in range(1, len(alist)): for j in range(i, 0, -1): ## 倒序取从下标i的元素开始到下标0 if alist[j] < alist[j - 1]: alist[j], alist[j - 1] = alist[j - 1], alist[j] list = [3, 4, 2, 7, 11, 15, 5] insert_sort(list) print(list)
3.3 算法优化
def insert_sort(alist): for i in range(1, len(alist)): for j in range(i, 0, -1): ## 倒序取从下标i的元素开始到下标0 if alist[j] < alist[j - 1]: alist[j], alist[j - 1] = alist[j - 1], alist[j] else: ## 如果当前数值大于前一个数值,退出 break list = [3, 4, 2, 7, 11, 15, 5] insert_sort(list) print(list)
快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
4.1 算法描述
快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:
4.2 算法实现
def quickSort(left, right, lst): l, r = left, right ## 确定左右指针 if left >= right: ## 如果序列只有一个元素,则退出排序 return ## 确定基准数为最左侧元素 base = lst[left] ## base为序列最左侧元素,则应为右指针先左移,然后左指针右移 while l < r: while l < r and lst[r] >= base: ## 如果l<r同时最右侧的值大于等于base,则向左移动r指针,退出的条件右指针的值<base r -= 1 while l < r and lst[l] <= base: ## 如果l<r同时最左侧的值小于等于base,则向右移动l指针,退出的条件左指针的值>base l += 1 if l < r: ## 如果左指针小于右指针(同时lst[r] < base lst[l] > base,满足上述两个条件),则交换左右指针的值 lst[l], lst[r] = lst[r], lst[l] lst[l], lst[left] = lst[left], lst[l] ## 基准数回归,将左右指针所指元素和基准数进行交换 ## 此时一次排序结束 quickSort(left, l - 1, lst) ## 对基准数左侧序列进行排序 quickSort(l + 1, right, lst) ## 对基准数右侧序列进行排序 list = [3, 4, 2, 7, 11, 15, 5] end = len(list) - 1 quickSort(0, end, list) ## 开始位置索引,结束位置索引,列表 print(list)
算法 | 时间复杂度(平均) | 空间复杂度 | 稳定性 |
---|---|---|---|
冒泡排序 | O(n2) | O(1) | 稳定 |
选择排序 | O(n2) | O(1) | 不稳定 |
插入排序 | O(n2) | O(1) | 稳定 |
快速排序 | O(nlog2n) | O(nlog2n) | 不稳定 |
关于python排序算法的实现就介绍到这,上述实例具有一定的参考价值,需要的朋友可以参考学习,希望能对大家有帮助,想要了解更多python算法的相关内容,大家可以关注其他文章,希望大家以后多多支持群英网络!
文本转载自脚本之家
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
今天教各位小伙伴怎么用Python处理excel,文中有非常详细的代码示例及相关知识总结,对正在学习python的小伙伴们很有帮助,需要的朋友可以参考下
Python使用类(class)和对象(object),进行面向对象(object-oriented programming,简称OOP)的编程。面向对象的最主要目的是提高程序的重
这篇文章主要为大家详细介绍了python实现简单五子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这篇文章给大家分享的是Python time库的使用,time库运行访问多种类型的时钟,这些时钟用于不同的场景,下文介绍了time库获取各种时钟 ,及获取并计算时间的函数使用等等,小编觉得挺实用的,因此分享给大家做个参考,文中示例代码介绍的非常详细,感兴趣的朋友接下来一起跟随小编看看吧。
这篇文章主要为大家介绍了Python推导式和生成器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008