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


相关推荐

  • PhpStorm中报 “Cannot run program git.exe, 系统找不到指定的文件” 

    PhpStorm中报 “Cannot run program git.exe, 系统找不到指定的文件” 

    2021年10月10日
    41
  • touchpoint_pointpillars

    touchpoint_pointpillars理想如果不向现实做一点点屈服,那么理想也将归于尘土。锚点的简介在SpriteKit的游戏开发当中经常会使用到AnchorPoint这一属性,锚点的使用一般是配合着position属性使用的,锚点是在自身View上找,这个点一一映射的有一个父view的坐标(使用position来表示),可以通过这两个值来计算子视图的位置信息.也就是说position用来设置CALayer在父层中的位置,而anchorPoint决定着CALayer身上的哪个点会在position属性所指的位置.coco.

    2022年10月8日
    0
  • JS前端去掉emoji表情和Java后台处理emoji表情方法

    莫非定律 : 任何事情都没表面看去来那么简单!emoji表情在项目中使用,因为其特殊的编码格式,经常导致在网络传输、编解码、以及数据入库中带来一些问题!下面简单介绍使用Js和java处理移除emoji表情!Emoji 表情的相关基础内容介绍,请读者自行在网上查找资料!前端JS代码//emojob编码集,因为emoji表情在不断地增加,下面的reg可能在未来会不能满足…

    2022年2月27日
    246
  • linux配置jdk的环境变量(linux环境安装jdk)

    首先下载jdk在Linux中的安装包如rpm格式或tar.gz、tar.bz2格式(我用的是jdk-7u40-linux-i586.rpm即rpm格式)下载后进入Linux中jdk的下载目录然后安装jdk:rpm-ivhjdk-7u40-linux-i586.rpm如图:即安装成功此时查看java和javac命令的版本会出现如下情况java命令的版本和javac命令

    2022年4月17日
    95
  • imx8主频_x5660处理器怎么样

    imx8主频_x5660处理器怎么样NXPi.MX系列应用处理器是基于32和64位ARM技术,提供多核解决方案,适用于多媒体和显示应用,具有高性能和低功耗、可扩展、安全可靠等特点。其成员有i.MX28系列、i.MX6系列、i.MX7系列、i.MX8系列、i.MXRT系列。这篇文章主要介绍i.MX8系列。i.MX8系列应用处理器根据不同配置有IMX8I、MX8M、IMX8Mini、IMX8MNano、IMX8X…

    2022年10月21日
    0
  • 华为手机桌面时钟天气_华为手机怎么让屏幕显示天气和时钟

    华为手机桌面时钟天气_华为手机怎么让屏幕显示天气和时钟华为手机锁屏时钟软件是一款安卓手机桌面锁屏时钟工具,拥有多种锁屏时钟样式,软件使用界面精致简洁,锁屏也能够看时间,拥有多种时钟颜色可以选择,还可以添加各种提醒服务,到点即可提醒用户,使用方法简单,拥有多种显示模式,需要的伙伴,西西下载使用吧!华为手机锁屏时钟软件特色:锁屏时钟是一款功能齐全又实用的时钟显示软件,主界面是一个自带时间、日期、天气的LED数字时钟和模拟时钟,全屏显示翻页时钟,酷炫美观…

    2022年9月29日
    1

发表回复

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

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