归并排序的递归实现与非递归实现代码

 更新时间:2013年08月23日 10:16:21   作者:  
以下是对归并排序的递归实现与非递归实现代码进行了详细的介绍,需要的朋友可以过来参考下

归并排序
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。值得注意的是归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

算法描述
归并操作的工作原理如下:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

时间复杂度:
时间复杂度为O(nlogn) 这是该算法中最好、最坏和平均的时间性能。
空间复杂度为 O(n)
比较操作的次数介于(nlogn) / 2和nlogn - n + 1。
赋值操作的次数是(2nlogn)。归并算法的空间复杂度为:0 (n)
归并排序比较占用内存,但却效率高且稳定的算法。
(以上摘抄自百度百科)

代码实现
自顶向上实现:
//使用辅助数组实现归并的过程

复制代码 代码如下:

void MergeSort(int *aux, int *data, int l, int m, int h)
{
 int k=0, i=l, j=m+1;

 for(k=l; k<=h; k++)
 {
  if(i>m)     aux[k]=data[j++];
  else if(j>h)    aux[k]=data[i++];
  else if(data[i]<data[j])        aux[k]=data[i++];
  else    aux[k]=data[j++];
 }
 for(k=l; k<=h; k++)
  data[k]=aux[k];
}

用递归实现排序的过程(自顶向下归并)
复制代码 代码如下:

void Sort(int *aux, int *data, int l, int h)
{
 if(l<h)
 {
  int m=l+(h-l)/2;
  Sort(aux, data, l, m);
  Sort(aux, data, m+1, h);
  MergeSort(aux,data, l, m, h);
 }
}

用非递归实现排序的过程(自底向上归并)
复制代码 代码如下:

void NonRerMerSort(int *aux, int *data, int l, int h)
{
 int i=l, j;
 for(i=l; i<=h; i=2*i)
 {
  for(j=l; j<=h-i; j+=2*i)
   MergeSort(aux, data, j, i+j-1, Min(j+2*i-1,h));
 }
}

相关文章

  • 利用Qt实现获取计算机的硬件信息

    利用Qt实现获取计算机的硬件信息

    在开发时,常常会需要用到计算机的相关信息。利用这些信息,我们可以开发一些辅助模块。本文将利用Qt实现获取计算机的硬件信息,感兴趣的可以尝试一下
    2022-12-12
  • C++数据结构分析多态的实现与原理及抽象类

    C++数据结构分析多态的实现与原理及抽象类

    继承就是可以直接使用前辈的属性和方法。自然界如果没有继承,那一切都是处于混沌状态。多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作
    2022-02-02
  • c++语言中虚函数实现多态的原理详解

    c++语言中虚函数实现多态的原理详解

    这篇文章主要给大家介绍了关于c++语言中虚函数实现多态的原理的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c++语言具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • C语言实现大数值金额大写转换的方法详解

    C语言实现大数值金额大写转换的方法详解

    这篇文章主要为大家详细介绍了如何利用C语言实现大数值金额大写转换的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-03-03
  • C语言链表完整操作演示

    C语言链表完整操作演示

    这篇文章主要为大家详细介绍了C语言链表的完整操作演示,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • C语言实现求定积分的方法

    C语言实现求定积分的方法

    这篇文章主要介绍了C语言实现求定积分的方法,涉及C语言操作相关数学函数的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • 带你分分钟玩转C语言指针

    带你分分钟玩转C语言指针

    c语言指针其实是一个整形变量,与其它数据不同的是,它的作用是用来存储其它变量的地址,下面这篇文章主要给大家介绍了关于C语言指针的相关资料,需要的朋友可以参考下
    2022-06-06
  • C++ 处理中文符号实例详解

    C++ 处理中文符号实例详解

    这篇文章主要介绍了C++ 处理中文符号实例详解的相关资料,需要的朋友可以参考下
    2017-01-01
  • linux C 打印错误信息和标准输入输出详细介绍

    linux C 打印错误信息和标准输入输出详细介绍

    这篇文章主要介绍了linux C 打印错误信息和标准输入输出详细介绍的相关资料,需要的朋友可以参考下
    2016-12-12
  • 简述C语言中system()函数与vfork()函数的使用方法

    简述C语言中system()函数与vfork()函数的使用方法

    这篇文章主要介绍了简述C语言中system()函数与vfork()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08

最新评论