排序算法思想的碰撞

来源:互联网 发布:淘宝1.1模型枪店铺 编辑:程序博客网 时间:2024/05/06 08:41

今天又重新复习了所有的内部排序算法,现在通过自己的理解再重新总结下,只说思想,代码就省略了。

        内部算法无非就是那么几种,分类也非常多,经典的严蔚敏版的数据结构把排序非为一下几种:

        插入排序:直接插入,折半插入,希尔;快速排序:冒泡排序,快排;选择排序:简单选择,堆排序;归并排序;基数排序;

我在这里以工程效率为途径按时间复杂度分成三类:

O(n^2):插入排序(直接插入排序,折半插入排序,希尔排序),选择排序,冒泡排序;O(nlogn):快速排序,归并排序,堆排序;O(an+b):桶排序,基数排序(可以算是桶排序的特殊形式)。

下面就详细总结下每种算法(假设变成递增序列):

        1.插入排序:一句话总结就是逐步扩展有序数列。遍历每个元素,把元素i插入到前i-1个元素的有序数列中构成新的个数为i的有序数列(i从1到n-1)。

插入排序有几种改良的排序,常见的是折半插入排序希尔排序。在元素i插入到前i-1个元素的有序数列时,直接插入是顺序寻找i的位置,那么在n比较大时效率就不那么高,这时候通过折半查找的方式找到i的位置往往效率更高一些,这就是折半插入排序。由于在序列基本有序的时候插入排序效率就会更高的特点,引申出了希尔排序,它又被称为“缩小增量排序”,它是将序列分割成若干个子序列进行插入排序,待元素基本有序时再对所有元素进行插入排序。一般做法是把增量设置为数组长度的一半,先把具体为增量的元素划为一个数组进行插入排序,之后再把增量除2进行同样操作,直到增量为1,即进行所有元素的插入排序。

特点最简单的排序算法,基本有序时最佳排序算法,稳定,空间复杂度O(1)。

        2.选择排序:每次选择第i+1小的元素与元素i进行交换(i从0到n-1)。

特点不稳定,空间复杂度O(1)。

3.冒泡排序:从最后一个元素开始往前遍历,两两元素进行比较,较小的元素交换到前面,执行第i遍的时候从元素n-1比到元素i,一共执行n-1遍。一个改进策略是每次交换元素的时候都记录下它最后一次交换的位置,这样执行下一遍的时候只需遍历到这个位置即可,这样避免已经排好序了以后还要再进行无用的遍历。

特点稳定,空间复杂度O(1)。

4.快速排序:选出其中一个数作为枢纽值(一般选第一个或者中值),把所有小于枢纽值得元素放到枢纽左边,大于枢纽值的元素放到右边。之后再分别对两面的序列做同样的操作。

特点不稳定,因为是递归操作,所以空间复杂度O(logn,如果用非递归操作的话,利用堆也需要同样的空间就平均性能而言,快速排序最佳。但是当数组有序时快速排序反而会降到O(n^2)。

5.归并排序:将序列逐步分成小段的子序列,直到长度为1,再将两两子序列归并成有序数列,直到归并成长度为n的有序序列。

特点稳定,空间复杂度O(n当n较大时比堆排序快,但空间辅助多

6.堆排序:堆排序是一个特殊的选择排序,每次选择最小数的时候都是以堆的形式进行筛选。它分为几个步骤:1.建立大根堆。从最后一个有子节点的节点往前遍历到根结点,遍历到的节点与它的子节点进行比较,较大子节点与本节点交换,直到交换到叶子结点。2.这时候根结点为最大元素,将它与最后一个结点进行交换。3.堆的长度减1,重新构建大根堆。最后重复以上三步。

特点不稳定,空间复杂度O(1)。适合记录较少的序列

7.桶排序:将n个序列分成m个桶,通过某种映射函数将每个元素都分配到对应的桶中要用到O(n)时间,这时候对每个桶中的元素进行排序需要的时间为(n/mlog(n/m))。所以时间复杂度为O(n)+O(nlogn)-O(mlogm),所以m越大效率越高,当m等于n时,时间复杂度可以达到O(n)。

特点稳定,空间复杂度O(n+m)。

8.基数排序:桶排序的一种特殊形式,比较有限定的排序策略,常用于int型的排序。准备0-9序号的桶,每个桶对应一个长度为n的数组。首先根据个位数上的数字添加到对应序号的桶中,这时候已经按照个位数排好序了,之后用这个序列再根绝十位数上数字做同样操作,依次比较到最高位,即可排好。所以基数排序的时间复杂度为O(kn),k为最大数的位数。

特点稳定,空间复杂度O(n,典型的空间换时间,适合n很大而关键字较小的序列


        后续不断更新。。。

原创粉丝点击