Chernobyl

<Data Structure and Algorithm>排序算法

  • 排序稳定:如果两个数相同,对他们进行的排序结果为他们的相对顺序不变。例如A={1,2,1,2,1}这里排序之后是A = {1,1,1,2,2} 稳定就是排序后第一个1就是排序前的第一个1,第二个1就是排序前第二个1,第三个1就是排序前的第三个1。同理2也是一样。不稳定就是他们的顺序与开始顺序不一致。
  • 原地排序:指不申请多余的空间进行的排序,就是在原来的排序数据中比较和交换的排序。例如快速排序,堆排序等都是原地排序,合并排序,计数排序等不是原地排序。总体上说,排序算法有两种设计思路,一种是基于比较,另一种不是基于比较。《算法导论》一书给出了这样一个证明:“基于比较的算法的最优时间复杂度是O(nlgn)”。对于基于比较的算法,有三种设计思路,分别为:插入排序,交换排序和选择排序。非基于比较的排序算法时间复杂度为O(lgn),之所以复杂度如此低,是因为它们一般对排序数据有特殊要求。如计数排序要求数据范围不会太大,基数排序要求数据可以分解成多个属性等。

 

基于比较的排序算法

 

 

插入排序

  • 直接插入排序

    特点:稳定排序,原地排序,时间复杂度O(n2)

    思想:将所有待排序数据分成两个序列,一个是有序序列S,另一个是待排序序列U,初始时,S为空,U为所有数据组成的数列,然后依次将U中的数据插到有序序列S中,直到U变为空。

    适用场景:当数据已经基本有序时,采用插入排序可以明显减少数据交换和数据移动次数,进而提升排序效率。

  • 希尔排序

    特点:非稳定排序,原地排序,时间复杂度O(nlamda)(1 < lamda < 2), lamda和每次步长选择有关。

    思想:增量缩小排序。先将序列按增量划分为元素个数近似的若干组,使用直接插入排序法对每组进行排序,然后不断缩小增量直至为1,最后使用直接插入排序完成排序。

    适用场景:因为增量初始值不容易选择,所以该算法不常用。

 

 

交换排序

  • 冒泡排序

    特点:稳定排序,原地排序,时间复杂度O(n2)

    思想:将整个序列分为无序和有序两个子序列,不断通过交换较大元素至无序子序列首完成排序。

    适用场景:同直接插入排序类似

  • 快速排序

    特点:不稳定排序,原地排序,时间复杂度O(nlgn)

    思想:不断寻找一个序列的枢轴点,然后分别把小于和大于枢轴点的数据移到枢轴点两边,然后在两边数列中继续这样的操作,直至全部序列排序完成。

    适用场景:应用很广泛,差不多各种语言均提供了快排API

 

 

 

选择排序

  • 简单选择排序

    特点:不稳定排序(比如对3 3 2三个数进行排序,第一个3会与2交换),原地排序,时间复杂度O(n2)

    思想:将序列划分为无序和有序两个子序列,寻找无序序列中的最小(大)值和无序序列的首元素交换,有序区扩大一个,循环下去,最终完成全部排序。

    适用场景:交换少

  • 堆排序

    特点:非稳定排序,原地排序,时间复杂度O(nlgn)

    思想:小顶堆或者大顶堆

    适用场景:不如快排广泛

 

 

 

其他排序

  •  归并排序

    特点:稳定排序,非原地排序,时间复杂度O(n2)

    思想:首先,将整个序列(共n个元素)看成n个有序子序列,然后依次合并相邻的两个子序列,这样一直下去,直至变成一个整体有序的序列。

    适用场景:外部排序

     

     

非基于比较的排序算法

非基于比较的排序算法主要有三种,分别为:基数排序,桶排序和计数排序。这些算法均是针对特殊数据的,不如要求数据分布均匀,数据偏差不会太大。采用的思想均是内存换时间,因而全是非原地排序。

  • 基数排序

    特点:稳定排序,非原地排序,时间复杂度O(n)

    思想:把每个数据看成d个属性组成,依次按照d个属性对数据排序(每轮排序可采用计数排序),复杂度为O(dn)

    适用场景:数据明显有几个关键字或者几个属性组成

  • 桶排序

    特点:稳定排序,非原地排序,时间复杂度O(n)

    思想:将数据按大小分到若干个桶(比如链表)里面,每个桶内部采用简单排序算法进行排序。

  • 计数排序

    特点:稳定排序,非原地排序,时间复杂度O(n)

    思想:对每个数据出现次数进行技术(用hash方法计数,最简单的hash是数组!),然后从大到小或者从小到大输出每个数据。

    适用场景:比基数排序和桶排序广泛得多。

 

 

 

 

 

posted on 2014-03-03 20:39  Chernobyl  阅读(192)  评论(0编辑  收藏  举报

导航