实例说明C语言中使用的合并排序的算法

来源:爱站网时间:2021-01-22编辑:网友分享
在用C语言编写程序时,排序算法的选择往往决定了编写程序所需的时间和精力,而选择合适的排序算法可以让我们达到事半功倍的效果,那么实例说明C语言中使用的合并排序的算法,大家清楚吗?建议大家选择爱站技术频道。

在用C语言编写程序时,排序算法的选择往往决定了编写程序所需的时间和精力,而选择合适的排序算法可以让我们达到事半功倍的效果,那么实例说明C语言中使用的合并排序的算法,大家清楚吗?建议大家选择爱站技术频道。

基础概念
百度百科是这么描述归并排序的:
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。
设有数列

{6,202,100,301,38,8,1}

初始状态:

[6] [202] [100] [301] [38] [8] [1] 

比较次数 

  i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3
 
  i=2 [ 6 100 202 301 ] [ 1 8 38 ] 4
 
  i=3 [ 1 6 8 38 100 202 301 ] 4

总计: 11次

 

实例

#include  
void printArr(int arr[],int length){ 
    int i; 
    for(i=0;i 1){ 
        int arr1[length-1],arr2[1] = {arr[length-1]}; 
        int i; 
        for(i=0;i

算法性能/复杂度
归并排序的效率是很高的,由于递归划分为子序列只需要logN复杂度,而合并每两个子序列需要大约2n次赋值,为O(n)复杂度,因此,只需要简单相乘即可得到归并排序的时间复杂度 O(㏒n)。并且由于归并算法是固定的,不受输入数据影响,所以它在最好、最坏、平均情况下表现几乎相同,均为O(㏒n)。
但是,归并排序最大的缺陷在于其空间复杂度。从上面的代码可以看到,在合并子数组的时候需要一个辅助数组,然后再把这个数据拷贝回原数组。所以,归并排序的空间复杂度(额外空间)为O(n)。可不可以省略这个数组呢?不行!如果取消辅助数组而又要保证原来的数组中数据不被覆盖,那就必须要在数组中花费大量时间来移动数据。不仅容易出错,还降低了效率。因此这个辅助空间是少不掉的。

算法稳定性
因为我们在遇到相等的数据的时候必然是按顺序“抄写”到辅助数组上的,所以,归并排序同样是稳定算法。

算法适用场景
归并排序在数据量比较大的时候也有较为出色的表现(效率上),但是,其空间复杂度O(n)使得在数据量特别大的时候(例如,1千万数据)几乎不可接受。而且,考虑到有的机器内存本身就比较小,因此,采用归并排序一定要注意。

实例说明C语言中使用的合并排序的算法有助于大家在学习建站的需求,欢迎收藏爱站技术频道学习更多的编程知识。

上一篇:详解C语言中结构的参照与互参照

下一篇:C语言中字符指针数组与字符数组的区别

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载