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


相关推荐

  • Ubuntu安装谷歌_谷歌地球手机专业版

    Ubuntu安装谷歌_谷歌地球手机专业版在Ubuntu18.04中安装谷歌地球GoogleEarthGoogleEarth在Linux系统中(Ubuntu18.04)的安装方法1.安装必备组建2.下载GoogleEarth安装包3.安装GoogleEarth4.开启运行GoogleEarthGoogleEarth在Linux系统中(Ubuntu18.04)的安装方法1.安装必备组建使用gdebi在我们的系统上安装Goo…

    2022年9月17日
    0
  • setContentView源码分析[通俗易懂]

    setContentView源码分析[通俗易懂]publicclassActivityTestextendsAppCompatActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_test);}}↓…

    2022年6月26日
    26
  • ubuntu 源仓库说明

    ubuntu 源仓库说明ubuntu网易源:debhttp://mirrors.163.com/ubuntu/xenialmainrestricteduniversemultiversedebhttp://mirrors.163.com/ubuntu/xenial-securitymainrestricteduniversemultiversedebhttp://mirrors.163.co

    2022年6月21日
    105
  • nessus扫描工具的使用_结合扫描器任务

    nessus扫描工具的使用_结合扫描器任务目录NessusScansSettings一个基本扫描的建立自定义扫描策略Nessus的高级扫描方法NessusNessus号称是世界上最流行的漏洞扫描程序,全世界有超过75000个组织在使用它。该工具提供完整的电脑漏洞扫描服务,并随时更新其漏洞数据库。Nessus不同于传统的漏洞扫描软件,Nessus可同时在本机或远端上遥控,进行系统的漏洞分析扫描。对应渗透测试人…

    2022年10月19日
    0
  • ZOJ Problem Set – 2563 Long Dominoes 【如压力dp】

    ZOJ Problem Set – 2563 Long Dominoes 【如压力dp】

    2022年1月13日
    46
  • 用eclipse创建一个java项目_eclipse创建第一个Java项目

    用eclipse创建一个java项目_eclipse创建第一个Java项目用eclipse创建一个Java项目流程:创建一个JavaProject–>创建一个Package–>创建类,然后就可以写代码并运行了。以下是具体操作:1、打开eclipse的工作空间(orkspace)到工作界面2、新建一个Java项目自己填写项目名3、新建一个包4、创建一个类勾选复选框(publicstaticvoidmain(String[]args)),是为了自动…

    2022年7月9日
    16

发表回复

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

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