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


相关推荐

  • PO:如何更新DEV中PO到QAS再到PRD「建议收藏」

    PO:如何更新DEV中PO到QAS再到PRD「建议收藏」1,首先PO中的单个对象最好以文件夹方式存放,这样便于管理和上传,将DEV中需要上传的文件夹导出: 2.勾选第四个: 可以直接将该文件拖拽过来 之后直接FINISH. 3.打开QAS的ESR,将

    2022年6月28日
    37
  • 手把手包教会_手把手地教是什么意思

    手把手包教会_手把手地教是什么意思文章目录前言?往期知识点Selenium简介1.1,组件1.2,特点前言Selenium是一个用于web自动化测试的框架,在使用Ajax请求数据的页面中,会出现sign,token等密钥,如果考虑去激活成功教程可能花费的精力较多,所以考虑借助使用Selenium框架来实现数据爬取。?往期知识点?往期内容回顾?python教程】保姆版教使用pymysql模块连接MySQL实现增删改查?python+requests+BeautifulSoup实现对数据保存到mysql数据库?sele

    2022年10月20日
    4
  • 概念模型设计「建议收藏」

    4.1.3     概念模型设计概念模型不依赖于具体的计算机系统,他是纯粹反映信息需求的概念结构。建模是在需求分析结果的基础上展开,常常要对数据进行抽象处理。常用的数据抽象方法是‘聚集’和‘概括’。ER方法是设计概念模型时常用的方法。用设计好的ER图再附以相应的说明书可作为阶段成果

    2022年4月6日
    106
  • java——Scanner中nextLine()方法和next()方法的区别

    java——Scanner中nextLine()方法和next()方法的区别        遇到一个有意思的东西,在整理字符串这块知识的时候,发现我在用Scanner函数时,在字符串中加入空格,结果空格后面的东西没有输出来(/尴尬),不多说直接上代码:importjava.util.Scanner;//Scanner中nextLine()方法和next()方法的区别publicclassScannerString{publicstatic…

    2022年4月27日
    45
  • IDEA全局替换快捷键

    IDEA全局替换快捷键IDEA全局替换配置教程

    2022年6月15日
    306
  • Idea激活码最新教程2022.3.3版本,永久有效激活码,亲测可用,记得收藏

    Idea激活码最新教程2022.3.3版本,永久有效激活码,亲测可用,记得收藏Idea 激活码教程永久有效 2022 3 3 激活码教程 Windows 版永久激活 持续更新 Idea 激活码 2022 3 3 成功激活

    2025年5月26日
    9

发表回复

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

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