基于python的七种经典排序算法.docx
《基于python的七种经典排序算法.docx》由会员分享,可在线阅读,更多相关《基于python的七种经典排序算法.docx(23页珍藏版)》请在三一办公上搜索。
1、基于python的七种经典排序算法基于python的七种经典排序算法 一、排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。 排序的稳定性: 经过某种排序后,如果两个记录序号同等,且两者在原无序记录中的先后秩序依然保持不变,则称所使用的排序方法是稳定的,反之是不稳定的。 内排序和外排序 内排序:排序过程中,待排序的所有记录全部放在内存中 外排序:排序过程中,使用到了外部存储。 通常讨论的都是内排序。 影响内排序算法性能的三个因素: 时间复杂度:即时间性能,高效率的排序算法应该是具有尽可能少
2、的关键字比较次数和记录的移动次数 空间复杂度:主要是执行算法所需要的辅助空间,越少越好。 算法复杂性。主要是指代码的复杂性。 根据排序过程中借助的主要操作,可把内排序分为: 插入排序 交换排序 选择排序 归并排序 按照算法复杂度可分为两类: 简单算法:包括冒泡排序、简单选择排序和直接插入排序 改进算法:包括希尔排序、堆排序、归并排序和快速排序 以下的七种排序算法只是所有排序算法中最经典的几种,不代表全部。 二、 冒泡排序 冒泡排序:时间复杂度O(n2) 交换排序的一种。其核心思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序记录为止。 其实现细节可以不同,比如下面3种: 1. 2.
3、 3. 最简单排序实现:bubble_sort_simple 冒泡排序:bubble_sort 改进的冒泡排序:bubble_sort_advance #!/usr/bin/env python# -*- coding:utf-8 -*-# Author: Liu Jiang# Python 3.5# 冒泡排序算法 class SQList: def _init_(self, lis=None): self.r = lis def swap(self, i, j): 定义一个交换元素的方法,方便后面调用。 temp = self.ri self.ri = self.rj self.rj = t
4、emp def bubble_sort_simple(self): 最简单的交换排序,时间复杂度O(n2) lis = self.r length = len(self.r) for i in range(length): for j in range(i+1, length): if lisi lisj: self.swap(i, j) def bubble_sort(self): 冒泡排序,时间复杂度O(n2) lis = self.r length = len(self.r) for i in range(length): j = length-2 while j = i: if lis
5、j lisj+1: self.swap(j, j+1) j -= 1 def bubble_sort_advance(self): 冒泡排序改进算法,时间复杂度O(n2) 设置flag,当一轮比较中未发生交换动作,则说明后面的元素其实已经有序排列了。 对于比较规整的元素集合,可提高一定的排序效率。 lis = self.r length = len(self.r) flag = True i = 0 while i = i: if lisj lisj + 1: self.swap(j, j + 1) flag = True j -= 1 i += 1 def _str_(self): ret
6、= for i in self.r: ret += %s % i return ret if _name_ = _main_: sqlist = SQList(4,1,7,3,8,5,9,2,6) # sqlist.bubble_sort_simple # sqlist.bubble_sort sqlist.bubble_sort_advance print(sqlist) 三、简单选择排序 简单选择排序:时间复杂度O(n2) 通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i:时间复杂度O(n2) 基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的
7、、记录数增1的有序表。 #!/usr/bin/env python# -*- coding:utf-8 -*-# Author: Liu Jiang# Python 3.5# 直接插入排序 class SQList: def _init_(self, lis=None): self.r = lis def insert_sort(self): lis = self.r length = len(self.r) # 下标从1开始 for i in range(1, length): if lisi temp and j = 0: lisj+1 = lisj j -= 1 lisj+1 = tem
8、p def _str_(self): ret = for i in self.r: ret += %s % i return ret if _name_ = _main_: sqlist = SQList(4, 1, 7, 3, 8, 5, 9, 2, 6, 0) sqlist.insert_sort print(sqlist) 该算法需要一个记录的辅助空间。最好情况下,当原始数据就是有序的时候,只需要一轮对比,不需要移动记录,此时时间复杂度为O(n)。然而,这基本是幻想。 五、希尔排序 希尔排序是插入排序的改进版本,其核心思想是将原数据集合分割成若干个子序列,然后再对子序列分别进行直接插入排
9、序,使子序列基本有序,最后再对全体记录进行一次直接插入排序。 这里最关键的是跳跃和分割的策略,也就是我们要怎么分割数据,间隔多大的问题。通常将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序。下面的例子中通过:increment = int(increment/3)+1来确定“增量”的值。 希尔排序的时间复杂度为:O(n(3/2) #!/usr/bin/env python# -*- coding:utf-8 -*-# Author: Liu Jiang# Python 3.5# 希尔排序 class SQList: def
10、_init_(self, lis=None): self.r = lis def shell_sort(self): 希尔排序 lis = self.r length = len(lis) increment = len(lis) while increment 1: increment = int(increment/3)+1 for i in range(increment+1, length): if lisi = 0 and temp = 0: self.heap_adjust(i, length-1) i -= 1 # 逆序遍历整个序列,不断取出根节点的值,完成实际的排序。 j =
11、length-1 while j 0: # 将当前根节点,也就是列表最开头,下标为0的值,交换到最后面j处 self.swap(0, j) # 将发生变化的序列重新构造成大顶堆 self.heap_adjust(0, j-1) j -= 1 def heap_adjust(self, s, m): 核心的大顶堆构造方法,维持序列的堆结构。 lis = self.r temp = liss i = 2*s while i = m: if i m and lisi = lisi: break liss = lisi s = i i *= 2 liss = temp def _str_(self):
12、 ret = for i in self.r: ret += %s % i return ret if _name_ = _main_: sqlist = SQList(4, 1, 7, 3, 8, 5, 9, 2, 6, 0, 123, 22) sqlist.heap_sort print(sqlist) 堆排序的运行时间主要消耗在初始构建堆和重建堆的反复筛选上。 其初始构建堆时间复杂度为O(n)。 正式排序时,重建堆的时间复杂度为O(nlogn)。 所以堆排序的总体时间复杂度为O(nlogn)。 堆排序对原始记录的排序状态不敏感,因此它无论最好、最坏和平均时间复杂度都是O(nlogn)。在
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 python 经典 排序 算法
链接地址:https://www.31ppt.com/p-3385127.html