合并排序算法在结构上是递归的,采用分治策略:就是将原有的问题划分为 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 实现排序算法(二)-合并排序(递归法)

    #!/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. 算法笔记_014:合并排序(Java)

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

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

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

  7. 算法實例-C#-歸併排序-MergeSort

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

  8. Java与算法之(11) - 合并排序

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

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

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

随机推荐

  1. [AngularJS] Catching errors with $exceptionHandler

    The AngularJS $exceptionHandler service allows you to catch and handle unanticipated JavaScript erro ...

  2. ajax的一部分知识

    jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(p ...

  3. boot2docker安装及使用

    更新homebrew 为了确保有boot2docker的安装脚本 brew update 安装boot2docker brew install boot2docker 初始化 boot2docker ...

  4. UTF-8编码与Unicode CS2的转换

    /* Convert a UTF-8 string into a UCS-2 array. */ void tcstrutftoucs(const char *str, uint16_t *ary, ...

  5. 使用angular的ng-repeat遇到的一个问题

    问题描述:ng-repeat绑定的数据集动态更新之后其包裹的子元素所绑定的事件全部丢失:问题详述:问题代码如下: <style> img{width:100px;height:100px; ...

  6. tab选项卡

    1 <!doctype html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or ...

  7. [引]MSDN Visual Basic 和 C# 中都会用到的编程概念

    本文转自:http://msdn.microsoft.com/zh-cn/library/dd460655.aspx 本节介绍 Visual Basic 和 C# 中都会用到的编程概念. 本节内容   ...

  8. android的平台架构及特性

    Android平台采用了整合的策略思想,包括底层Linux操作系统.中间层的中间件和上层的Java应用程序.下面我把Android的特性及其架构体系结构总结一下. 一.Android的平台特性 And ...

  9. ADB无线连接

    注意:PC和手机在同一个局域网 背景:很长的时候手机线不够用,连接线还是不爽,偶尔会掉,平时可能手机会被拿走,重现crash的问题,不能很友好的使用DDMS,自己找了一些文章,ADB无线连接,实验成功 ...

  10. mysql查找重复

    중복된 것 모두 찾기    SELECT 필드명, count(*) FROM 테이블명  GROUP BY 필드명   mysql> SELECT t1, count(*) FROM tes ...