一、常用排序算法简述
下面重要大年夜排序算法的根本概念、道理出发,分别大年夜算法的时光复杂度、空间复杂度、算法的稳定性和速度等方面进行分析比较。根据待排序的问题大年夜小(记录数量 n)的不合,排序过程中须要的存储器空间也不合,由此将排序算法分为两大年夜类:【内排序】、【外排序】。
内排序:指排序时数据元素全部存放在计算机的随机存储器RAM中。
外排序:待排序记录的数量很大年夜,乃至内存一次不克不及容纳全部记录,在排序过程中还须要对外存进行拜访的排序过程。
先懂得一下常见排序算法的分类关系(见图1-1)
图1-1 常见排序算法
二、内排序相干算法
2.1 插入排序
核心思惟:将一个待排序的数据元素插入到前面已经排好序的数列中的恰当地位,使数据元素依然有序,直到待排序数据元素全部插入完为止。
2.1.1 直接插入排序
核心思惟:将欲插入的第i个数据元素的关键码与前面已经排序好的i-1、i-2 、i-3、 … 数据元素的值进行次序比较,经由过程这种线性搜刮的办法找到第i个数据元素的插入地位 ,并且本来地位 的数据元素次序后移,直到全部排好次序。
直接插入排序中,关键词雷同的数据元素将保持原有地位不变,所以该算法是稳定的,时光复杂度的最坏值为平方阶O(n2),空间复杂度为常数阶O(l)。
Python源代码:
快速排序时一个不稳定的算法,其最坏值的时光复杂度为平方阶O(n2),空间复杂度为O(log2n)。
- #-------------------------直接插入排序--------------------------------
- def insert_sort(data_list):
- #遍历数组中的所有元素,个中0号索引元素默认已排序,是以大年夜1开端
- for x in range(1, len(data_list)):
- #将该元素与已排序好的前序数组依次比较,如不雅该元素小,则交换
- #range(x-1,-1,-1):大年夜x-1倒序轮回到0
- for i in range(x-1, -1, -1):
- #断定:如不雅相符前提则交换
- if data_list[i] > data_list[i+1]:
- temp = data_list[i+1]
- data_list[i+1] = data_list[i]
- data_list[i] = temp
2.1.2 希尔排序
核心思惟:是把记录按下标的必定增量分组,对每组应用直接插入排序算法排序;跟着增量逐渐削减,每组包含的症礁绞艚来越多,当增量减至1时,全部文件恰被分成一组,算法便终止。
希尔排序时光复杂度会比O(n2)好一些,然而,多次插入排序中,第一次插入排序是稳定的,但在不合的插入排序过程中,雷同的元素可能在各自的插入排序中移动,所以希尔排序是不稳定的。
Python源代码:
- #-------------------------希尔排序-------------------------------
- def insert_shell(data_list):
- #初始化step值,此处应用序列长度的一半为其赋值
- group = int(len(data_list)/2)
- #第一财揭捉?环:依次改变group值对列表进行分组
- while group > 0:
- #下面:应用直接插入排序的思惟对分组数据进行排序
- #range(group,len(data_list)):大年夜group开端
- for i in range(group, len(data_list)):
- #range(x-group,-1,-group):大年夜x-group开端与选定元素开端倒序比较,每个比较元素之间距离group
- for j in
推荐阅读
Android中内存优化的那些事 - 一个有关图片的优化记录
客服群里叫唤着:这个用户图片不显示了,那个用户图片也不显示了。我拿着手上一切正常的测试机,what the hell……默默地打开bugly。 满园春色关不住,遍地内存溢出来!是的,>>>详细阅读
本文标题:常用排序算法比较与分析
地址:http://www.17bianji.com/lsqh/35003.html
1/2 1