排序算法
按种类分为内部排序和外部排序。
内部排序是指,数据完全可以在内存中完成排序。
外部排序是指,数据太大,需要一部分一部分读入内存就行排序。
外部排序的典型做法是,将数据分成若干合理大小数据段,先一段一段送入内存排序并存在硬盘中,然后再两两归并排序。其中两两合并,叫做两路排序。名称由来是,归并排序采用败者树算法,有几个叶子节点就是几路排序。需要额外内存空间。
内部排序:
插入排序:(直接插入排序,二分查找插入排序,希尔排序)
直接插入排序,第二个数据与第一个数据进行比较,小于第一个数则将第二哥数据插入第一个数据之前;第三个数据与第二个数据进行比较,若比第二个小,再比较第一个数据,若比较第一个数据大,插入第一个数据之后,否则插入第一个数据之前······递归····,时间复杂度最差(倒序数据)O(n^2),最好(有序数据)O(n),平均O(n^2)。 稳定。
二分查找排序是对直接插入排序的优化,优化的地方在于,可以减少比较的次数,最好情况复杂度为O(log2n).其余相同。
希尔排序是对直接插入排序的优化,优化的地方在于,将整个序列划分成若干组进行排序,再分别对子序列进行直接插入排序,使得原来序列成为基本有序。这样通过对较小的序列进行插入排序,然后对基本有序的数列进行插入排序,能够提高插入排序算法的效率。时间复杂度最好(有序数据)O(n),最坏O(nlog2n),平均O(nlog2n)。
在直接插入排序中,插入操作是通过逐个移动元素位置实现的。
NOTE:一个排序算法的稳定与否,是看未排序前,相同数据的相对次序在经过该排序算法排序后,是否会发生改变。改变则不稳定,否则稳定。稳定性的意义在于,是否需要排序算法的稳定性。比如,对于一个复杂对象的多个属性排序,对应 同一类别商品 的 价格 销量, 如果按价格排好序后,又想按销量排序,这时,对于相同销量的商品,其之前的价格顺序不会改变。这时如果对销量相同的商品要求价格顺序不改变,这样的情况下,排序算法的稳定性才有意义。
冒泡排序:
冒泡排序的核心思想是,比较相邻两元素,大的一方在前面的话,交换二者顺序,使大数在后,从头交换到序列尾部,则序列中最大的元素在序列尾部,这时一次扫描和比较,再从头进行扫描和两两元素比较交换,则第二大的元素在序列倒数第二的位置,重复该步骤,最终得到升序的序列。时间复杂度,最好O(n)最坏O(n^2),平均O(n^2)。
选择排序:
选择排序也是一种简单直观的排序算法。它的工作原理很容易理解:初始时在序列中找到最小(大)元素,放到序列的起始位
置作为已排序序列;然后,再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾。以此类推,直到所有元
素均排序完毕。时间复杂度,最好O(n^2)最坏O(n^2),平均O(n^2)。