合并排序(MERGE SORT)是又一类不同的排序方法,合并的含义就是将两个或两个以上的有序数据序列合并成一个新的有序数据序列,因此它又叫归并算法。

它的基本思想就是假设数组A有N个元素,那么可以看成数组A是又N个有序的子序列组成,每个子序列的长度为1,然后再两两合并,得到了一个 N/2 个长度为2或1的有序子序列,再两两合并,如此重复,值得得到一个长度为N的有序数据序列为止,这种排序方法称为2—路合并排序。
  例如数组A有7个数据,分别是: 49 38 65 97 76 13 27,那么采用归并排序算法的操作过程: 
  初始值 [49] [38] [65] [97] [76] [13] [27] 
  看成由长度为1的7个子序列组成 
  第一次合并之后 [38 49] [65 97] [13 76] [27] 
  看成由长度为1或2的4个子序列组成 
  第二次合并之后 [38 49 65 97] [13 27 76] 
  看成由长度为4或3的2个子序列组成 
  第三次合并之后 [13 27 38 49 65 76 97] 
  合并算法的核心操作就是将一维数组中前后相邻的两个两个有序序列合并成一个有序序列。合并算法也可以采用递归算法来实现,形式上较为简单,但实用性很差。合并算法的合并次数是一个非常重要的量,根据计算当数组中有3到4个元素时,合并次数是2次,当有5到8个元素时,合并次数是3次,当有9到16个元素时,合并次数是4次,按照这一规律,当有N个子序列时可以推断出合并的次数是X(2 >=N,符合此条件的最小那个X)。
  其时间复杂度为:O(nlogn).所需辅助存储空间为:O(n)
  归并算法如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int RecType;//要排序元素类型
void Merge(RecType *R, int low, int m, int high)
{
//将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的子文件R[low..high]
int i = low, j = m + , p = ; //置初始值
RecType *R1; //R1是局部向量
R1 = (RecType *)malloc((high - low + )*sizeof(RecType));
if (!R1)
{
return; //申请空间失败
} while (i <= m&&j <= high) //两子文件非空时取其小者输出到R1[p]上
{
R1[p++] = (R[i] <= R[j]) ? R[i++] : R[j++];
} while (i <= m) //若第1个子文件非空,则复制剩余记录到R1中
{
R1[p++] = R[i++];
}
while (j <= high) //若第2个子文件非空,则复制剩余记录到R1中
{
R1[p++] = R[j++];
} for (p = , i = low; i <= high; p++, i++)
{
R[i] = R1[p]; //归并完成后将结果复制回R[low..high]
}
} void MergeSort(RecType R[], int low, int high)
{
//用分治法对R[low..high]进行二路归并排序
int mid;
if (low<high)
{ //区间长度大于1
mid = (low + high) / ; //分解
MergeSort(R, low, mid); //递归地对R[low..mid]排序
MergeSort(R, mid + , high); //递归地对R[mid+1..high]排序
Merge(R, low, mid, high); //组合,将两个有序区归并为一个有序区
}
}
void main()
{
int a[] = { , , , , , , }; //这里对7个元素进行排序
int low = , high = ; //初始化low和high的值 printf("Before merge sort: \n");
for (int i = low; i <= high; i++)
{
printf("%d ", a[i]); //输出测试
}
printf("\n"); MergeSort(a, low, high); printf("\n After merge sort: \n");
for (int i = low; i <= high; i++)
{
printf("%d ", a[i]); //输出测试
}
printf("\n");
}

实现归并排序;归并排序算法分为两步,第一步:先将原来的数据表分成排好序的子表,然后调用 Merger  对子表进行归并,使之成为有序表,例如有如下向量:

25,10,7,19,3,48,12,17,56,30,21

对此序列进行归并排序的步骤为:

非递归算法     https://www.cnblogs.com/xing901022/p/3671771.html

归并排序(C语言)的更多相关文章

  1. 排序(6)---------归并排序(C语言实现)

    归并排序: 归并操作,也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.归并排序算法依赖归并操作. 归并操作的步骤例如以下:     (1) 申请空间,使其大小为两个已经排序序列之和.该空 ...

  2. 归并排序c语言

    void mergeAdd(int arr[], int left, int mid, int right, int *temp){ int i = left; ; int k = left;//临时 ...

  3. 归并排序(JAVA语言)

    public class merge { public static void main(String[] args) { // TODO Auto-generated method stub int ...

  4. 高速排序,归并排序,堆排序python实现

    高速排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n^2),平均情况下为O(n*logn),是不稳定的排序 归并排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*l ...

  5. 归并排序的C语言实现

    归并排序的核心思想是 Divide-and-Conquer 算法,即将要解决的size为n的问题,分成a个size为n/b的子问题,这些子问题的结果经过O(n^d)的时间复杂度合并,即可解决最初的问题 ...

  6. 归并排序,递归法,C语言实现。

    利用归并排序法对序列排序的示意图(递归法): 一.算法分析:利用递归的分治方法:1.将原序列细分,直到成为单个元素:2.在将分割后的序列一层一层地按顺序合并,完成排序.细分通过不断深入递归完成,合并通 ...

  7. 归并排序的go语言与C++实现对比

    最近对go语言发生了兴趣,发现go语言语法简洁,非常适合算法的描述和实现,于是对归并排序进行了实现. 例子中需要排序的队列是长度为100的从100到1的数列,排序算法是正序排序,排序正确的话,结果应当 ...

  8. 二路归并排序算法实现-完整C语言程序

    /*********************************************************************************************** 1.设 ...

  9. c语言 快速排序---归并排序----堆排序

    //快速排序: #include <stdio.h> #define MAX 500000 int s[MAX]; void Q_Sort(int start,int end) { int ...

  10. 排序算法的C语言实现(上 比较类排序:插入排序、快速排序与归并排序)

    总述:排序是指将元素集合按规定的顺序排列.通常有两种排序方法:升序排列和降序排列.例如,如整数集{6,8,9,5}进行升序排列,结果为{5,6,8,9},对其进行降序排列结果为{9,8,6,5}.虽然 ...

随机推荐

  1. malloc calloc realloc 区别

    (1)C语言跟内存分配方式 <1>从静态存储区域分配.       内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量.static变量.<2> ...

  2. 运行javac 报告javac不是内部或外部命令,但是运行java、java-version正常

    以前装jdk 从来没遇到过今天这种情况,各种解决办法试了一下午,终于出来了,说一下解决的办法: JAVA_HOME .classpath 都在系统变量中建立好: java_home 添加jdk的安装目 ...

  3. NodeJS学习笔记五

    Promise简介 所谓Promise,就是一个对象,用来传递异步操作的消息. Promise对象有以下两个特点. (1)对象的状态不受外界影响.Promise对象代表一个异步操作,有三种状态:Pen ...

  4. Python中的MySQL接口:PyMySQL & MySQLdb

    MySQLdb模块只支持MySQL-3.23到5.5之间的版本,只支持Python-2.4到2.7之间的版本 PyMySQL支持 Python3.0以后的版本 PyMySQL https://pypi ...

  5. 生成TPC-H数据集

    下载tpc-h tool 版本有点老,2.14.3,够用了. 在解压的文件夹下面cd到dbgen下,找到makefile.suite. ~/tpch_2_14_3$ cd dbgen~/tpch_2_ ...

  6. Float类型出现舍入误差的原因(round 取位)

    在练习时,输入如下代码: 结果不准确. 原因:https://blog.csdn.net/bitcarmanlee/article/details/51179572 浮点数一个普遍的问题就是在计算机的 ...

  7. HttpClient-RestTemplate-Feign

    如何通过Java发送HTTP请求,通俗点讲,如何通过Java(模拟浏览器)发送HTTP请求. Java有原生的API可用于发送HTTP请求,即java.net.URL.java.net.URLConn ...

  8. 在使用swiper时,解决同一个页面使用多个轮播出现问题做法

    $(".swiper-container").each(function(){ $(this).swiper({ loop: true, initialSlide :0, pagi ...

  9. JFreeChart DateAxis用法

    http://blog.csdn.net/xiaozhendong123/article/details/50131513

  10. Python笔记 #11# 统计图定制化

    将数据可视化有许多选择: 图的类型 定制化方式 选择什么样的表现方式通常取决于: 数据 你想表达什么 1.Labels # Basic scatter plot, log scale plt.scat ...