二路归并排序算法实现-完整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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 掌上生活app下载安装_浏览器下载

    掌上生活app下载安装_浏览器下载环境要求HttpRunner是一个基于Python开发的测试框架,可以运行在macOS、Linux、Windows系统平台上。这里使用macOS系统进行演示对于python版本要求:py

  • linux之lvm分区扩容[通俗易懂]

    linux之lvm分区扩容[通俗易懂]以下步骤的前提为磁盘lvm分区1、加入新硬盘2、分区PV(physicalvolume)即物理卷,就是物理磁盘,可以通过fdisk-l查看操作系统有几块硬盘VG(volumegroup)即卷组,就是一组物理磁盘的组合,里面可以有一块硬盘也可以有多块硬盘LV(logicalvolume)及逻辑卷,就是在VG(指定的物理磁盘组)里面划分出来的可以说成是PV就是硬盘…

  • 超全MyBatis动态SQL详解!( 看完SQL爽多了)

    超全MyBatis动态SQL详解!( 看完SQL爽多了)MyBatis令人喜欢的一大特性就是动态SQL。在使用JDBC的过程中,根据条件进行SQL的拼接是很麻烦且很容易出错的。MyBatis动态SQL的出现,解决了这个麻烦。MyBatis通过OGNL来进行动态SQL的使用的。目前,动态SQL支持以下几种标签:1数据准备为了后面的演示,创建了一个Maven项目mybatis-dynamic,创建了对…

  • 深度学习—1.认识深度学习

    深度学习—1.认识深度学习

  • IDEA快捷键设置复制上一行

    IDEA快捷键设置复制上一行Idea真是的一个神奇的ide,用着爱不择手。之前用习惯了eclipse的“ctrl+向下箭头”,复制一行,如何设置idea里这个快捷键呢File-&gt;settings-&gt;keymap-&gt;搜索duplicate-&gt;双击DuplicateEntireLines设置一下,搞定,又可以很爽的用ctrl+向下箭头复制一行了虽说以上的一种解决方法,但是经…

  • CentOS7 安装以太坊 geth 客户端、创建私有区块链及挖矿

    CentOS7 安装以太坊 geth 客户端、创建私有区块链及挖矿安装以太坊源码,即安装GoEthereum(安装Geth)1、安装Golang可以直接使用yum这个包管理器安装Golangyuminstallgolang2、下载以太坊源码(GoEthereum)首先下载geth源码go-ethereum,这里以go-ethereum-1.9.7.tar.gz,直接在GitHub下载3、安装以太坊源码(安装Geth)接下来解压源码:tar-xzfgo-ethereum-1.9.7.tar.gz用下…

发表回复

您的电子邮箱地址不会被公开。

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