排序主要分为两大类:内部排序和外部排序。文章主要介绍一下内部排序的方法,分为插入排序、交换排序、选择排序和归并排序四种。
插入排序
直接插入排序
希尔排序
交换排序
冒泡排序
快速排序
快速排序同样是交换排序的一种,是对冒泡排序的一种改进。
基本思想:在n个记录中取某一个记录的键值为标准,通常取第一个,通过一趟排序将待排的记录分为小于或等于这个键值和大于这个键值的两个独立的部分,继续对每个部分单独进行排序,直到得出最后结果。
例如:已有序列:
45 85 23 41 58 12 76 34
用快速排序对其进行排序。
分析:首先,以45为基准,45与34进行比较,34<45,将34与45交换位置:34 85 23 41 58 12 76 45;继续将45与85进行比较,85>45,85与45交换位置:34 45 23 41 58 12 76 85;继续将45与76比较,此时45<76,符合顺序,则不交换;继续将45与12比较,45>12,45与12交换位置:34 12 23 41 58 45 76 85;依次类推,直到完成第一趟排序:34 12 23 41 45 58 76 85
继续分别对 34 12 23 41 和 58 76 85 进行快速排序,依次类推,直到得出最终结果:
12 23 34 41 45 58 76 85
快速排序:排序方法最佳,时间复杂度O(nlog2n),最坏情况下,时间复杂度O(n^2);
排序方法是不稳定的。
选择排序
我们来介绍直接选择排序和堆排序两个选择方法。
直接选择排序
基本思想:在第i次选择操作中,通过n-i次键值间比较,从n-i+1个记录中选出键值最小的记录,并和第i(1<=i<=n-1)个记录交换。
例如:已有记录序列
34 45 78 14 26
用直接选择排序进行排序。
分析:选择记录34,在45 78 14 26中选出键值最小的记录,即14,与34交换位置:14 45 78 34 26;
继续选择记录45,在78 34 26中选出键值最小的记录,即26,与45交换位置:14 26 78 34 45;
继续选择记录78,在34 45中选出键值最小的记录,即34,与45交换位置:14 26 34 78 45;
继续比较78和45,78>45,将78和45交换位置,得到最后结果:
14 26 34 45 78
直接选择排序:时间复杂度O(n^2);
是不稳定的方法。
归并排序
归并排序的不同之处在于要求待排序列是由若干个有序子序列组成。归并排序的基础是合并。
二路归并排序
将两个有序表合并成一个有序表的排序方法。
基本思想:序列中有n个记录,可看成是n个子系列,每个系列的长度为1,。首先将每相邻的两个记录合并,得到[n/2]个较大的有序子序列,每个子序列包含2个记录,再依次将上述子序列两两合并,如此反复,知道得到有序序列,排序结束。
例如:已有序列记录
25 9 78 6 65 15 58 18
采用归并排序发排序。
分析:首先将序列中的记录:
两两合并:[25 9] [78 6] [65 15] [58 18]
一次归并后:[9 25] [6 78] [15 65] [18 58]
二次归并后:[6 9 25 78] [15 18 58 65]
三次归并后:[6 9 15 18 25 58 65 78]
归并排序:时间复杂度O(nlog2n);
是稳定的方法。
总结
对于所有的排序算法来说,没有哪一种是最优的,所以,在实际应用时根据不同情况选择合适的算法,或者,有必要时将多种算法结合起来使用。