算法之合并排序(mergeSort)

时间:2022-08-23 00:09:34

  合并排序算法在结构上是递归的,采用分治策略:就是将原有的问题划分为 n 个规模较小但结构与原问题相似的子问题,递归地解决这些子问题,然后合并其结果,就得到原问题的解。

  合并排序的模式一般如下:

  1.分解:将 n 个元素分解为各含 n/2 个元素的两个序列;

  2.解决:用分治排序法对两个子序列递归地排序;

  3.合并:合并两个已排好序的子序列得到排序结果。

  在对子序列递归的过程中,当子序列元素数为1时,递归结束。

  合并排序算法的时间复杂度为O(nlgn)

 void merge(int* a, int p, int q, int r)
{
int i = ;
int j = ;
int k = ;
int n1 = q - p + ;
int n2 = r - q;
int* L = (int*)malloc((n1 + ) * sizeof(int));
int* R = (int*)malloc((n2 + ) * sizeof(int));
for(i = ; i < n1; i++)
{
*(L + i) = a[p + i];
}
*(L + n1) = INT_MAX; //插入序列末标志 for(i = ; i < n2; i++)
{
*(R + i) = a[q + i + ];
}
*(R + n2) = INT_MAX; //插入序列末标志 i = ;
j = ;
k = ;
for(k = p; k < r + ;k++)
{
if(*(L + i) > *(R + j))
{
*(a + k) = *(R + j);
j++;
}
else
{
*(a + k) = *(L + i);
i++;
}
}
} void mergeSort(int* a, int p, int r)
{
int q = ;
if(p < r)
{
q = (r + p) / ;
mergeSort(a, p, q);
mergeSort(a, q + , r);
merge(a, p, q, r);
}
}

注:1. mergeSort(int* a, int p, int r) 和 merge(int* a, int p, int q, int r)中的形参 p, q, r 都是序列 a 的索引,其中子序列 L = (a[p] ~ a[q]),其长度为 q - p + 1;子序列 R = (a[q + 1] ~ a[r]),其长度为 r - (q + 1) - 1 即 r - q;

   2.在上述代码中都插入了 序列标志数,这个数默认为∞,但在实际应用中,该数有可能会出现在应用序列中,merge函数可改为如下:

 void merge(int* array, int p, int q, int r)
{
int i = ;
int j = ;
int k = ;
int n1 = q - p + ;
int n2 = r - q;
int* L = (int*)malloc((n1) * sizeof(int));
int* R = (int*)malloc((n2) * sizeof(int));
for(i = ; i < n1; i++)
{
*(L + i) = array[p + i];
}
//*(L + n1) = INT_MAX; for(j = ; j < n2; j++)
{
*(R + j) = array[q + j + ];
}
//*(R + n2) = INT_MAX; i = ;
j = ;
k = ;
for(k = p; k < r + ;k++)
{
if(i > (n1 - ))
{
*(array + k) = *(R + j);
j++;
}
else if(j > (n2 - ))
{
*(array + k) = *(L + i);
i++;
}
else
{
if(*(L + i) > *(R + j))
{
*(array + k) = *(R + j);
j++;
}
else
{
*(array + k) = *(L + i);
i++;
}
}
}
}

算法之合并排序(mergeSort)的更多相关文章

  1. 算法:合并排序(Merge Sort)

    算法定义 合并排序是一种递归算法,思路如下: 如果源数组长度为 1,立即返回. 将源数组平分为两个新数组:Left 和 Right. 对 Left 执行递归排序. 对 Right 执行递归排序. 将排 ...

  2. Shell排序算法和合并排序算法

    Shell排序(希尔排序)算法Shell排序严格来说基于插入排序的思想,其又称为希尔排序或者缩小增量排序. Shell排序的流程:1.将由n个元素的数组分成n/2个数字序列,第1个数据和第n/2+1个 ...

  3. python 实现排序算法&lpar;二&rpar;-合并排序&lpar;递归法&rpar;

    #!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Tue Nov 21 22:28:09 201 ...

  4. Python实现合并排序MergeSort

    def merge(sort_list, start, mid, end): left_list = sort_list[start:mid] right_list = sort_list[mid:e ...

  5. 算法笔记&lowbar;014&colon;合并排序(Java)

    1 问题描述 给定一组数据,使用合并排序得到这组数据的非降序排列. 2 解决方案 2.1 合并排序原理简介 引用自百度百科: 合并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Div ...

  6. javascript 中合并排序算法 详解

    javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的...  合并排序代码如下: <script type="text/javascript& ...

  7. 算法實例-C&num;-歸併排序-MergeSort

    # 算法实例 # 排序算法Sort 歸併排序MergeSort 算法說明 歸併的思路是任意兩個元素可以比較大小,那麼任意兩個有序的元素集合也可以通過比較大小的方式歸併成一個有序的元素集合 任何的無序元 ...

  8. Java与算法之&lpar;11&rpar; - 合并排序

    天下事,合久必分,分久必合.合并排序的基本思想正是先分再合. 例如对3, 1这个数列排序,首先是分,分为3和1两个数列,然后再合并并排序.合并需要额外的辅助空间,即建立一个两个数列长度之和的空数组用于 ...

  9. java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述

    算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...

随机推荐

  1. tcpdump用法

    http://man.linuxde.net/tcpdump http://www.cnblogs.com/yc_sunniwell/archive/2010/07/05/1771563.html

  2. Quoit Design

    Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission ...

  3. 转:视频压缩的基本概念&lpar;x264解压包&rpar;

    第1页:前言——视频压缩无处不在H.264 或者说 MPEG-4 AVC 是目前使用最广泛的高清视频编码标准,和上一代 MPEG-2.h.263/MPEG-4 Part4 相比,它的压缩率大为提高,例 ...

  4. C语言signal处理的小例子

    [pgsql@localhost tst]$ cat sig01.c #include <stdio.h> #include <signal.h> static void tr ...

  5. Linux 目录操作和4中文件拷贝效率测试

    /*1.用户输入任意目录名称,显示该目录下的文件列表信息,包括文件类型,文件权限,文件大小,文件名称2.拷贝用户输入的文件到当前目录下3.第二点功能,使用4种方式完成,并比较说明效率*/ /* str ...

  6. BZOJ1758&colon; &lbrack;Wc2010&rsqb;重建计划

    题解: 这题我居然做了一星期?... 平均值的极值其实也可以算是一种分数规划,只不过分母上b[i]=1 然后我们就可以二分这个值.类似与 HNOI最小圈 如果没有 链的长度的限制的话,我们直接两遍df ...

  7. POJ 1703 Find them&comma; Catch them (数据结构-并查集)

    Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 31102   Accepted: ...

  8. JavaEE Tutorials &lpar;3&rpar; - 企业bean

    3.1什么是企业bean383.1.1企业bean的好处393.1.2何时使用企业bean393.1.3企业bean类型393.2什么是会话bean393.2.1会话bean类型403.2.2何时使用 ...

  9. spring集成redis

    redis是一种非关系型数据库,与mongoDB不同的是redis是内存数据库,所以访问速度很快.常用作缓存和发布-订阅式的消息队列.redis官方没有提供windows版本的软件.windows版本 ...

  10. Saltstack之Scheduler

    一.引言: 在日常的运维工作中经常会遇到需要定时定点启动任务,首先会考虑到crontab,但是通过crontab的话需要每台机器下进行设置,这样统一管理的话比较复杂:通过查百度和google发现sal ...