二路归并排序算法实现-完整C语言程序

推荐:http://www.cnblogs.com/roucheng/p/cppjy.html

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

/*********************************************************************************************** 
1.设定两个指针,最初位置分别为两个已经排序序列的起始位置 
2.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 
3.重复步骤3直到某一指针达到序列尾 
4.将另一序列剩下的所有元素直接复制到合并序列尾 
归并排序: 
归并排序具体工作原理如下(假设序列共有n个元素): 
1.将序列每相邻两个数字进行归并操作,形成floor(n / 2)个序列,排序后每个序列包含两个元素 
2.将上述序列再次归并,形成floor(n / 4)个序列,每个序列包含四个元素 
3.重复步骤2,直到所有元素排序完毕 
 
归并排序是稳定的,它的最差,平均,最好时间都是O(nlogn)。但是它需要额外的存储空间. 
 何问起 hovertree.com
 
归并排序法(Merge Sort,以下简称MS)是分治法思想运用的一个典范。 
其主要算法操作可以分为以下步骤:  
Step 1:将n个元素分成两个含n/2元素的子序列  
Step 2:用MS将两个子序列递归排序(最后可以将整个原序列分解成n个子序列)  
Step 3:合并两个已排序好的序列  
 
************************************************************************************************/  
  
#include<iostream>  
#include<cstdio>  
#include<cstring>  
#include<algorithm>  
#include<cmath>  
#include<climits>  
#include<cstdlib>  
#include<time.h>  
#include<cstdlib>  
#include<cstdio>  
using namespace std;  
void Random(int a[],int n)  
{  
    int i=0;  
    srand( (unsigned)time( NULL ) );  
    while(i<n)  
    {  
        a[i++]=rand();  
    }  
}  
void merge(int *a, int low, int mid, int high) //归并操作  
{  
    int k, begin1, begin2, end1, end2;  
    begin1 = low;  
    end1 = mid;  
    begin2 = mid + 1;  
    end2 = high;  
    int *temp = (int *) malloc((high - low + 1) * sizeof(int));  
    for(k = 0; begin1 <= end1 && begin2 <= end2; k++) //自小到大排序  
    {  
        if(a[begin1] <= a[begin2])  
            temp[k] = a[begin1++];  
        else  
            temp[k] = a[begin2++];  
    }  
    if(begin1 <= end1) //左剩  
        memcpy(temp + k, a + begin1, (end1 - begin1 + 1) * sizeof(int));  
    else //右剩  
        memcpy(temp + k, a + begin2, (end2 - begin2 + 1) * sizeof(int));  
    memcpy(a + low, temp, (high - low + 1) * sizeof(int)); //排序后复制到原数组  
    free(temp); //释放空间  
}  
void merge_sort(int *a, unsigned int begin, unsigned int end)  
{  
    int mid;  
    if(begin < end)  
    {  
        mid=begin+(end-begin)>>1;  
        //mid = (end + begin) / 2;  防止数据加法溢出  
        merge_sort(a, begin, mid); //分治  
        merge_sort(a, mid + 1, end); //分治  
        merge(a, begin, mid, end);  //合并两个已排序的数列  
    }  
}  
int main()  
{  
    int a[20];  
    Random(a,20);  
    for(int i=0;i<20;i++)  
    {  
        cout<<" "<<a[i]<<" ";  
    }  
  
    merge_sort(a, 0, 20-1);  
    for(int i=0;i<20;i++)  
    {  
        cout<<" "<<a[i]<<endl;  
    }  
  
    return 0;  
  
}  

推荐:http://www.cnblogs.com/roucheng/p/cppjy.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120413.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Windows下目录和文件名长度的限制

    Windows下目录和文件名长度的限制&lt;noscripttype="text/javascript"&gt;&lt;/noscript&gt;&lt;noscripttype="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;/noscript&gt;今天,一个网友,问Windows

    2022年10月20日
    3
  • IntelliJ IDEA配置Maven详解[通俗易懂]

    IntelliJ IDEA配置Maven详解[通俗易懂]1.下载Maven官方地址:http://maven.apache.org/download.cgi目前最新版是apache-maven-3.8.3版本,我当时使用的是apache-maven-3.5.2版本,大家也可以下载最新版本。Apache-maven-3.5.2下载地址:http://archive.apache.org/dist/maven/maven-3/下载后的版本如下:解压并新建一个本地仓库文件夹:2.配置本地仓库路径在MAVE_HOME/conf/setti

    2025年6月1日
    3
  • 语音合成(speech synthesis)两种方法-拼接合成和参数合成

    语音合成(speech synthesis)两种方法-拼接合成和参数合成TTS(TextToSpeech)是一个序列到序列的匹配问题。处理TTS的方法一般分为两部分:文本分析和语音合成(speechsynthesis)。文本分析可能采用NLP方法。而在语音合成(speechsynthesis)上有两种主要的方法:一种是非参数化的,基于样例的方法,如拼接语音合成;另一种是参数化的、基于模型的方法,如统计参数语音合成。拼接语音合成:基于统计规则的大语料库拼接语音合成系统超大规模音库制作:语料设计;音库录制;精细切分;韵律标注;优点:音质最佳,录音和合成音质差异小

    2022年6月26日
    25
  • 5个常用的MySQL数据库管理工具_SQL工具

    5个常用的MySQL数据库管理工具_SQL工具原文:http://www.techxue.com/techxue-11898-1.html如今,Web应用程序的响应速度是成功的关键法宝之一。它与用户互动,用户对网站的看法,甚至谷歌网站排名情况都有着密不可分的关系。数据库性能是响应速度最重要的因素之一,一旦出错,所有程序都将会宕机。工欲善其事,必先利其器。几乎每一个Web开发人员都有一个最钟爱的MySQL管理工具,它帮助开发人员在许

    2022年8月22日
    5
  • 基于Proxy思想的Android插件框架

    基于Proxy思想的Android插件框架

    2022年1月27日
    51
  • java中sqrt函数的详解[通俗易懂]

    java中sqrt函数的详解[通俗易懂]一、原理:牛顿迭代法具体解释:牛顿迭代法求平方根那我们怎么用牛顿迭代法呢?首先要明白,牛顿迭代法求的是函数和X轴的交点的横坐标,也就是我们说的根1)那么第一步就是构建曲线了。假设有一个数c,我们求它的平方根x,那么有一个等式,x^2=c;挪到一边就是求f= x^2-c的根x2)带入上面的公式也就是 3)既然是个迭代,那么

    2022年5月7日
    79

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号