再来谈排序

来源:互联网 发布:网络原创女歌手 编辑:程序博客网 时间:2024/06/05 11:28
排序,这个无解的话题

再来总结一下最近看排序的心得

我们目前学的排序都是属于内部排序,所谓内部排序,外部排序就是你要排序的序列是否可以在内存中放下,如果序列过长,需要与磁盘相交互,这就是外部排序了,而在内存内的话,就是我们熟知的一些算法了,对于外部的具体实现我并不了解,就不做发言了。
我们在这里谈一下内部排序
分类:

  • 插入排序
    总体思想:对于一个无序序列,我们都确定第一个元素作为一个有序序列,后续元素依次插入这个子序列,并始终保证子序列有序,最终整个序列都已插入,则此时整个序列均有序。
    上面是直接插入排序的思想
    改进版:希尔排序,它是通过让序列先变得基本有序,之后再运行直接插入排序算法,来提高效率
    具体执行是:它增添了一个变量h,作为增量,以这个增量为标准,给整个序列分组,然后在分组内排序,逐步使得序列基本有序,增量取得话,一般是n/2,n/4,…,1 当增量唯一的时候,这是便是直接插入排序了

  • 选择排序
    总体思想:每次遍历整个序列时,找到最大的那个值,放在序列最末尾,然后依次找下去,直到遍历完整个序列
    改进版:二元选择排序,我们既然要每次遍历一遍序列,那我们将最大值找了出来,不如我们在将最小值也一起找出来,这样遍历的次数便减半了,提高了算法的效率,
    大优化版:堆排序,通过树结构来优化,建小顶堆,大顶堆

  • 交换排序
    总体思想:从第一个元素开始,找逆序对,然后交换,一直采取这个动作,其实这样一次遍历,也是实现了每次将此时遍历的子序列中的最大/小值放在序列的末尾,遍历指导不再会发现逆序对时,终止
    冒泡排序,典型的例子http://blog.csdn.net/qq_32635069/article/details/52215096
    优化:快速排序,相信大家并不陌生,在上面的思想中,不难发现,每次遍历,都发生了许多无用的遍历,着严重影响了效率,所以快排便是将这些无用的交换删除了
    http://blog.csdn.net/qq_32635069/article/details/52244213

  • 归并排序
    总体思想:与快排正好反着,快排是将一个序列,逐步切割为一个个有序的子序列,而它是直接将序列方程一个个元素,这样每个序列都有序了,然后再逐渐合并,这样实现有序

  • 桶排序
    不是很了解,现在这里欠下了

介绍讲完;
让我们谈一谈各种排序的关系
- 稳定性问题
选择排序,快排,希尔排序,堆排序都是不稳定的
冒泡排序,插入排序,归并排序是稳定的

  • 关于当快排的序列基本有序时,时间复杂度会退化到O(n^2),而此时对于冒泡排序,插入排序的时间复杂度则是O(n),所以不一定时间复杂度低的排序就一定好,他各有自己的特点,适用于不同的场景。对,关于为什么快排会退化,是因为他如果已经已基本有序,那么在选取基准时,总是选取第一个,这样我们总是将第一元素作为一个子序列,后面的所有元素作为一个子序列这样效率便是O(n^2)了;所以也可以避免这种情况,我们在选取基准元素时,选第一个元素,最后一个元素,中间元素的中间值
原创粉丝点击