我的算法天梯之路之-归并排序
插入排序算法采取增量式(Incremental)的策略解决问题,每次添一个元素到已排序的子序列 中,逐渐将整个数组排序完毕,它的时间复杂度是Θ(n2)。下面介绍另一个典型的排序算法– 归并排序,它采取分而治之(Divide-and-Conquer)的策略,时间复杂度是Θ(nlgn),优于插入 排序算法。归并排序的步骤如下:
- Divide: 把长度为n的输入序列分成两个长度为n/2的子序列。
- Conquer: 对这两个子序列分别采用归并排序。
- Combine: 将两个排序好的子序列合并成一个最终的排序序列。
在描述归并排序的步骤时又调用了归并排序本身,可见这是一个递归的过程。
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
|
在merge函数中演示了C99的新特性–可变长数组,当然 也可以避免使用这一特性,比如把left和right都按最大长度LEN分配。
程序耗时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
相比之下冒泡排序在时间复杂度上就较为逊色了,且要排序的元素越多时,差别越大!
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
程序耗时
1 2 3 4 5 6 |
|