插入、冒泡排序的速度较慢,但参加排序的序列局部或整体有序时,这种排序能达到较快的速度。
在这种情况下,快速排序反而慢了。
较小情况(如n<60)
当n较小时,对稳定性不作要求时宜用选择排序,对稳定性有要求时宜用插入或冒泡排序。
若待排序的记录的关键字在一个明显有限范围内时,且空间允许是用桶排序。
较大情况:
当n较大时,关键字元素比较随机,对稳定性没要求宜用快速排序。
当n较大时,关键字元素可能出现本身是有序的,对稳定性有要求时,空间允许的情况下。
宜用归并排序。
当n较大时,关键字元素可能出现本身是有序的,对稳定性没有要求时宜用堆排序。
插入排序
它的基本思想是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
即:左手拿着所有牌,每次从左手拿一张放到右手,并放到对应位置排好序,这样最终所有牌都变的有序。
希尔排序
是对直接插入排序的一种优化,实质就是把直接插入排序改为了分组插入排序。
基本思想是将整个待排序元素序列按gap(步长)分割为N个组,对每个组进行直接插入排序,然后在减小gap(步长)再进行直接插入排序,直到gap达到最小时,即数组基本达到有序时,再对数组进行直接插入排序,此时直接插入排序就可以达到最高效率。
选择排序
基本思想每次通过从无序的数组中选择出一个最小的(要求升序排列)数把他放到数组的最前面。再依次找次小的数字放到数组无序区的最前。直到数组为有序。
即,左手拿着所有牌,每次从左手牌中选择最小的或者最大的依次放到右手,这样最终所有牌都变的有序。
堆排序
基本思想:
初始时把要排序的数的序列看作是一棵顺序存储的二叉树,调整它们的存储顺序,使之成为一个堆,这时堆的根节点的数最大。然后将根节点与堆的最后一个节点交换。然后对前面(n-1)个数重新调整使之成为堆。依此类推,直到只有两个节点的堆,并对它们作交换,最后得到有n个节点的有序序列。
基本实现原理
也是一种选择排序,但是堆排序是更加优化的选择排序的版本,它利用了堆的特性,父结点的值大于或小于子结点,且满足完全二叉树,大大提高了选择排序的效率。
冒泡排序
简单直观的排序方式,它是一种交换式的排序方法
基本思想就是相近的两个数字作比较,小的放到前面,大的放后面,按照这个规则从头向后比较,最大的数就被换到了数组尾。
即类似与选择排序,但选择排序不交换位置,手里拿着所有牌,从第一张开始与第二张比较,然后第二张与第三张比较,每次比较大的或比较小的移动到后面,直到被移动到数组尾,也即找到最大的数或者最小的数了,然后再进行下次重复寻找...
快速排序
它的应用场景是大规模的数据排序,并且实际性能要好于归并排序。
基本思想是从数组中选取一个元素,把所有大于这个元素的数都放到它的后面,所有小于这个元素的数都放到它的前面,然后这个元素就把原数组切分成了两个部分,再分别对这个两个部分进行同样的操作,直到数组不能再切分的时候,此时数组为有序。
即:选择手里的一个扑克牌为基准点,比牌大的放到左边,比牌小的放到右边,这样这个基准点就在它应该在的位置了。
然后重复上面的动作,左边的牌使用一下快速排序,右边的牌也使用一下。如此反复,直到左边是一张牌或者没牌,右边也是一张牌或者没牌。所有牌就有序了。
归并排序
归并的含义是将两个或两个以上的有序表组合成一个新的有序表,归并排序和快排一样也采用的是分治的思想。
它的基本原理是通过对若干个有序结点序列的合并为一个有序序列来实现排序的。
即:先将数先从中间分组,分成左右两个,左右两个再分组,直到数组中只剩一个元素,然后再合并。类似进栈出栈。合并的时候认为左边是有序的,右边也是有序的。(一个元素时候肯定是有序的,就看合并时候按从大到小,还是从小到大合并了)
基数排序
一种非比较式的排序方式,和快排,冒泡排序,插入排序这些排序算法不一样,它没有使用任何交换的方式。
它的基本思想是通过分配的方法把元素从小到大分配,以到达排序的作用。
即:个位和十位都是0-9,也即分配10个桶,先排个位,也即先按个位数,把数字依次放到对应的桶中,然后再从0号桶依次取出所有桶中的数,然后,排十位,按照10位数字依次把数字放到对应的桶中,然后依次取出,如果有百位,则继续排。最后数组是有序的。
核心思想是:先排个位数,再排10位数,再排百位数....等等,最后肯定是有序的。