算法设计之常见排序算法总结

蛮力法

蛮力法是一种简单直接地解决问题的方法,常常直接基于问题的描述和所涉及的概念定义。
蛮力法运用广泛,它几乎可以解决所有的问题。

选择排序

在选择排序开始时,扫描整个数组,找出最小的元素,将其与第一个元素交换;然后从第二个元素开始扫描,找出剩下的n-1个元素的最小值,与第二个元素交换,以此重复操作,直到整个数组都被扫描完。

对于任意规模的输入,选择排序都是一个(n^2)的算法。键的交换次数仅为θ(n),或者更精确一点,是n-1次,这个特点使得选择排序优于其他很多排序算法。

冒泡排序

比较表中的相邻元素,如果是逆序的话就交换元素位置,。重复多次后,最大的元素就沉到了最后的位置,在将n-1个元素重复上诉操作,在n-1此操作之后就能排好序。

冒泡排序算法在最坏情况或平均情况下下仍然是一个θ(n^2),在普通排序算法中,冒泡排序也不是一个很好的排序算法。

减治法

减治技术利用了一个问题给定实力的解和同样问题较小实例解之间的某种关系。一旦建立了这种关系,既可以自顶向下,也可以自底向上来运用关系。自顶向下会导致递归。

减治法3种主要变化形式:

  • 减去一个常因子
  • 减去一个常量
  • 减去的规模是可变的

插入排序

假设已经有一个顺序数组,将新元素插入到此数组的合适位置使数组始终有序。从右到左扫描这个有序数组,直到遇到第一个小于等于这个元素的,把新元素插入到这个元素的后面。

这是一个稳定的排序算法。插入排序是一个θ(n^2)。插入排序算法平均性能比最差性能快一倍,遇到基本有序的排序时表现出的有益性能,使得插入排序领先于选择排序算法和冒泡算法。
它有一种扩展–希尔排序,提供一种更好的算法,对较大的文件进行排序。

拓扑排序-源删除算法

基于无环有向图,我们是否可以按照某种次序列出它的顶点,使得对于图中每一条边来说,边的起始顶点总是在边的结束顶点之前。

源删除算法不断做一件事,在余下的有向图中求出一个源,它是一个只有出,没有入边的点。删除这个点,删除点的次序就是拓扑排序的结果。

源删出算法获得的解和基于DFS算法得到的解是不同的,因为源删除的结果不唯一。

分治法

  1. 将一个问题划分为同类型的若干子问题,子问题最好规模相同。
  2. 对子问题求解,在小规模时,也可利用其他算法。
  3. 有必要的话,合并子问题的结果,已得到原始问题的答案。

合并排序

对于一个待排序数组A[0…N-1],合并排序把他分为两个:A[0…(N/2)-1]和A[N/2…N-1],然后对每个子数组进行排序,然后再合并。

合并排序是一个θ(nlogn),合并排序时稳定排序算法。

快速排序

快速排序是一种基于分治法的重要排序。快速排序按照元素的值进行划分,而合并排序时基于元素的位置进行划分的。在合并排序中,划分为两个子序列很快,但是快速排序划分是很复杂的过程。在划分后,快速排序不需要再合并子问题,直接可以的到答案。

快速排序是一个θ(n^2),是不稳定的排序算法。

你可能感兴趣的:(排序算法)