排序算法复杂度 排序算法( 六 )


插入排序
冒泡排序
选择排序
快速排序
堆排序
归并排序
基数排序
希尔排序
插入排序
插入排序是这样实现的:
首先新建一个空列表,用于保存已排序的有序数列(我们称之为"有序列表") 。
从原数列中取出一个数,将其插入"有序列表"中,使其仍旧保持有序状态 。
【排序算法复杂度 排序算法】重复2号步骤,直至原数列为空 。
插入排序的平均时间复杂度为平方级的,效率不高,但是容易实现 。它借助了"逐步扩大成果"的思想,使有序列表的长度逐渐增加,直至其长度等于原列表的长度 。
冒泡排序
冒泡排序是这样实现的:
首先将所有待排序的数字放入工作列表中 。
从列表的第一个数字到倒数第二个数字,逐个检查:若某一位上的数字大于他的下一位,则将它与它的下一位交换 。
重复2号步骤,直至再也不能交换 。
冒泡排序的平均时间复杂度与插入排序相同,也是平方级的,但也是非常容易实现的算法 。
选择排序
选择排序是这样实现的:
设数组内存放了n个待排数字,数组下标从1开始,到n结束 。
i=1
从数组的第i个元素开始到第n个元素,寻找最小的元素 。
将上一步找到的最小元素和第i位元素交换 。
如果i=n-1算法结束,否则回到第3步
选择排序的平均时间复杂度也是O(n2)的 。
快速排序
现在开始,我们要接触高效排序算法了 。实践证明,快速排序是所有排序算法中最高效的一种 。它采用了分治的思想:先保证列表的前半部分都小于后半部分,然后分别对前半部分和后半部分排序,这样整个列表就有序了 。这是一种先进的思想,也是它高效的原因 。因为在排序算法中,算法的高效与否与列表中数字间的比较次数有直接的关系,而"保证列表的前半部分都小于后半部分"就使得前半部分的任何一个数从此以后都不再跟后半部分的数进行比较了,大大减少了数字间不必要的比较 。但查找数据得另当别论了 。
堆排序
堆排序与前面的算法都不同,它是这样的:
首先新建一个空列表,作用与插入排序中的"有序列表"相同 。
找到数列中最大的数字,将其加在"有序列表"的末尾,并将其从原数列中删除 。
重复2号步骤,直至原数列为空 。
堆排序的平均时间复杂度为nlogn,效率高(因为有堆这种数据结构以及它奇妙的特征,使得"找到数列中最大的数字"这样的操作只需要O(1)的时间复杂度,维护需要logn的时间复杂度),但是实现相对复杂(可以说是这里7种算法中比较难实现的) 。
看起来似乎堆排序与插入排序有些相像,但他们其实是本质不同的算法 。至少,他们的时间复杂度差了一个数量级,一个是平方级的,一个是对数级的 。
平均时间复杂度
插入排序 O(n2)
冒泡排序 O(n2)
选择排序 O(n2)
快速排序 O(n log n)
堆排序 O(n log n)
归并排序 O(n log n)
基数排序 O(n)
希尔排序 O(n1.25)
冒泡排序
654
比如说这个,我想让它从小到大排序,怎么做呢?
第一步:6跟5比,发现比它大,则交换 。564
第二步:5跟4比,发现比它大,则交换 。465
第三步:6跟5比,发现比它大,则交换 。456
排序算法有多少种排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列 。
排序就是把集合中的元素按照一定的次序排序在一起 。一般来说有升序排列和降序排列2种排序,在算法中有8中基本排序:
(1)冒泡排序;
(2)选择排序;
(3)插入排序;
(4)希尔排序;
(5)归并排序;
(6)快速排序;
(7)基数排序;
(8)堆排序;
(9)计数排序;
(10)桶排序 。
插入排序
插入排序算法是基于某序列已经有序排列的情况下,通过一次插入一个元素的方式按照原有排序方式增加元素 。这种比较是从该有序序列的最末端开始执行,即要插入序列中的元素最先和有序序列中最大的元素比较,若其大于该最大元素,则可直接插入最大元素的后面即可,否则再向前一位比较查找直至找到应该插入的位置为止 。插入排序的基本思想是,每次将1个待排序的记录按其关键字大小插入到前面已经排好序的子序列中,寻找最适当的位置,直至全部记录插入完毕 。执行过程中,若遇到和插入元素相等的位置,则将要插人的元素放在该相等元素的后面,因此插入该元素后并未改变原序列的前后顺序 。我们认为插入排序也是一种稳定的排序方法 。插入排序分直接插入排序、折半插入排序和希尔排序3类 。

秒懂生活扩展阅读