1. 整体介绍
分类
排序大的分类可以分为两种,内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。主要需要理解的都是内排序算法:
内排序可以分为以下几类:
(1)、插入排序:直接插入排序、二分法插入排序、希尔排序。
(2)、选择排序:简单选择排序、堆排序。
(3)、交换排序:冒泡排序、快速排序。
(4)、归并排序
(5)、基数排序
性能对比
稳定性:就是能保证排序前两个相等的数据其在序列中的先后位置顺序与排序后它们两个先后位置顺序相同。即如果A i == A j,A i 原来在 A j 位置前,排序后 A i 仍然是在 A j 位置前。
不稳定:简单选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法
稳定:冒泡排序、直接插入排序、二分法插入排序,归并排序和基数排序都是稳定的排序算法。
时间复杂度:一个算法执行所耗费的时间。
O(nlogn):快速排序,归并排序,希尔排序,堆排序。
O(n^2):直接插入排序,简单选择排序,冒泡排序。
O(n): 桶、箱、基数排序
快速排序是目前基于比较的内部排序中最好的方法, 其次是归并和希尔,堆排序在数据量很大时效果明显。当数据是随机分布时快速排序的平均时间最短。
空间复杂度:运行完一个程序所需内存的大小。
解释:n: 数据规模;k:“桶”的个数;In-place: 占用常数内存,不占用额外内存;Out-place: 占用额外内存。
排序方法的选择
1.数据规模很小(插入、简单选择、冒泡)
(1)数据基本有序的情况下,可选直接插入排序;
(2)数据无序时,对稳定性不作要求宜用简单选择排序,对稳定性有要求宜用插入或冒泡
2.数据规模一般(快速排序、归并排序)
(1)完全可以用内存空间,序列杂乱无序,对稳定性没有要求,快速排序,此时要付出log(N)的额外空间。
(2)序列本身可能有序,对稳定性有要求,空间允许下,宜用归并排序
3.数据规模很大(归并、桶)
(1)对稳定性有求,则可考虑归并排序。
(2)对稳定性没要求,宜用堆排序
4.待排序列初始基本有序(正序),宜用直接插入,冒泡
2. 插入排序(Insertion Sort)
基本思想:依次遍历元素,在已排序的序列中找到合适的位置将当前遍历的元素插入,直到所有元素都已排序。
方法:直接插入排序、二分插入排序、希尔排序
2.1 直接插入排序
算法思想:
<1>.从第一个元素开始,该元素可以认为已经被排序;
<2>.取出下一个元素,在已经排序的元素序列中从后向前扫描;
<3>.如果该元素(已排序)大于新元素,将该已排序元素移到下一位置;
<4>.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
<5>.将新元素插入到该位置后;
<6>.重复步骤2~5。
时间复杂度:平均情况下:O(n2)
最好的情况下:正序有序(从小到大),这样只需要比较n次,不需要移动。因此时间复杂度为O(n)
最坏的情况下:逆序有序,这样每一个元素就需要比较n次,共有n个元素,因此实际复杂度为O(n2)
稳定性:稳定。由算法思想易知