二路归并排序算法实现-完整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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • IDEA 将项目打包war包[通俗易懂]

    IDEA 将项目打包war包[通俗易懂]IntelliJIDEA将项目打包war包1、准备工作IntelliJIDEA开发工具可以正常运行的Java项目2、打包war包流程使用快捷键Ctrl+Alt+Shift+s或者鼠标点击选中项目名按F4打开ProjectStructure界面选择Artifacts,点击右边+,依次选择WebApplication:Archive和For’myP…

    2022年11月2日
  • 分布式 mybatis-plus 逻辑删除不生效 升级后org.mybatis.logging.LoggerFactory报错[通俗易懂]

    分布式 mybatis-plus 逻辑删除不生效 升级后org.mybatis.logging.LoggerFactory报错[通俗易懂]解决方案:第一步:升级mybatisplus版本到3.2.0第二步.多添加一个扩展包<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-extension</artifactId&gt…

    2022年6月2日
  • 20210225-1 Python错误与异常「建议收藏」

    20210225-1 Python错误与异常「建议收藏」一、什么是异常Python错误与异常什么是异常>异常是一个事件,该事件会在程序执行过程中发生,影响程序的正常执行。一般情况下,在Python无法正常处理程序时就会发生异常。异常是Pyth

    2022年7月5日
  • 词法环境和变量环境_lexicalcategory

    词法环境和变量环境_lexicalcategory词法环境是一个理论上存在的对象。由什么组成?环境记录(environmentrecord)和对外部词法环境的引用。暂且认为这些来自不同地方的宝石,团结起来,暂时组成了一个新的对象。

    2022年8月6日
  • Source Insight 4.0 序列号 license文件

    Source Insight 4.0 序列号 license文件安装程序下载在官网上下载SourceInsight4.0的安装程序.目前版本4.00.0098可用30天的试用安装首次启动选择授权方式,这里选择第二个选项,30天试用。点击下一步,输入名称、公司或组织名称、邮箱信息,申请30天的试用。输入完成后,点击下一步,直到安装完成。修改sourceinsight4.exe用16进制编辑器(sublimetext)打开s…

    2022年7月26日
  • 我的世界怎么显示坐标_我的世界永久显示坐标

    我的世界怎么显示坐标_我的世界永久显示坐标在我的世界游戏中,坐标这个问题如果玩的很6的话能够帮助我们瞬间移动,去到任何想去的地方,这时有不少玩家不禁想问了,我的世界坐标怎么看,坐标指令又是什么呢?坐标(coordinates)在数字上反映了您在主世界中的位置。坐标基于一个由三条交于一点(即原点)的坐标轴而形成的网格。玩家会出生在距离原点数百方块的位置上。x轴反映了玩家距离原点在东()西(-)方向上的距离,如经度。z轴反映了玩家距离原点在…

    2022年4月19日

发表回复

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

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