合并排序(归并排序)
合并排序是利用分治法的算法思想来解决排序问题的。
分治法:将原问题划分成n个规模较小而结构与原问题相似的子问题,递归的解决这些子问题,然后将结果合并。
基本思想:将序列分为两个子序列,并对两个子序列分别排序,之后将已排序子序列合并,即为排序结果,其中两个子序列的 排序也按照分成更小的子序列,直至分解到单个元素,即为已排序子序列,然后合并。
算法描述:
合并算法:
%将数组中两个已排序部分合并为一个
%数组,从而得到已排序的数组A
function A = my_merge(A,p,q,r)
%n1,n2为两个已排序的数组长度。
n1 = q - p +1;
n2 = r - q;
L = zeros(1,n1);
R = zeros(1,n2);
%将两个已排序部分分别复制到L,R
for i = 1:1:n1
L(i) = A(p+i-1);
end
for j = 1:1:n2
R(j) = A(q+j);
end
%问题转化为将L,R两个已排序数组,合并到数组A中。
%引进“哨兵”,简化代码
L(n1 + 1) = 500;
R(n2 + 1) = 500;
%每一次一定会加入元素,而且直至加入r-p+1个元素
%所以仅需一次循环
i = 1;
j = 1;
for k = p:1:r
if L(i) < R(j)
A(k) = L(i);
i = i+1;
else
A(k) = R(j);
j = j+1;
end
end
排序:
%合并排序A,从下标p到r
function A = my_merge_sort(A,p,r)
%如果p小于r,将数组分为两部分
%分别对各个部分调用排序函数,
%最后合并
if p < r
q = floor((r + p)/2);
my_merge_sort(A,p,q); %排序前半部分
my_merge_sort(A,q+1,r); %排序后半部分
my_merge(A,p,q,r); %合并
end
end
时间复杂度:o(n*logn)
分享到:
相关推荐
选择排序、插入排序、冒泡排序以及快速排序和归并排序的C语言实现,绝对可用
- **过程**:计算中间位置 `m`,递归地对左侧和右侧的子数组进行归并排序,然后调用 `guibing` 函数完成合并。 3. **主函数 `main`**: - 定义了一个包含乱序整数的数组 `ary`,调用 `merge_sort` 对数组进行排序...
合并排序与自顶向上归并排序类似,都是基于分治策略。区别在于,合并排序可以是自底向上或自顶向下实现。这里主要介绍自底向上的方法: - 从长度为1的子序列开始,逐步合并相邻的子序列,形成长度为2、4、8...的...
本文将深入探讨三种常见的高效排序算法:堆排序、快速排序和归并排序。它们都是基于不同的原理和策略,具有各自的优势和适用场景。 首先,堆排序是一种基于比较的排序算法,利用了二叉堆的数据结构。二叉堆是一个...
【合并排序(分治策略)】是一种高效的排序算法,它采用了经典的分治思想。分治法的基本策略是将一个难以直接解决的大问题分解为若干个规模较小、相互独立、与原问题形式相同的子问题,再将子问题的解组合得到原问题...
二分归并排序通常使用递归实现,MATLAB中的实现可能涉及两个辅助函数,一个用于分割数组,另一个用于合并已排序的子数组。这种算法在处理大数据集时效率高,时间复杂度为O(n log n)。 3. **归并排序**(Merge Sort...
3. **合并操作**:在归并排序中,合并是将两个已经排序的子数组合并成一个有序数组的过程。这个过程中需要用到额外的存储空间,通常是一个与原数组同样大小的临时数组。比较两个子数组的元素,依次将较小的元素放入...
9. 递归的归并排序:归并排序通常使用递归实现,通过递归调用自身对数组的前半部分和后半部分进行排序,然后用归并操作合并结果。这种递归方式使算法具有清晰的逻辑结构。 10. 基数排序:基数排序是一种非比较型...
以下是关于"冒泡排序,选择排序,插入排序,希尔排序,堆排序,归并排序,快速排序"这七种常见排序算法的源码实现及相关知识点的详细解释: 1. **冒泡排序**:冒泡排序是一种简单的排序算法,它重复地遍历待排序的...
6. **二路归并排序**:将数组分成两半,分别对左右两部分进行排序,然后合并两个已排序的部分。C#实现中,通常需要额外的空间来存储中间结果,所以是稳定的排序算法。二路归并排序的时间复杂度在所有情况下都保持在O...
本资源包含了几种常见的排序算法,包括堆排序、选择排序、冒泡排序、归并排序和插入排序。这些排序算法各有特点,适用于不同的场景,并且在理解它们的工作原理后,能够帮助初学者更好地掌握编程基础。 1. **堆排序*...
- **空间复杂度**:O(n),因为归并排序需要额外的空间用于临时存储合并后的子序列。 **3. C++实现代码** ```cpp void Merge(int r[], int r1[], int s, int m, int t) { int i, j, k; i = s; j = m + 1; k = s; ...
4. 归并排序:同样基于分治策略,将数组分成两半,分别进行排序,然后合并两个已排序的子数组。归并排序是稳定的排序算法,时间复杂度为O(n log n)。 5. 插入排序:对于未排序的元素,依次将其插入到已排序部分的...
**合并排序**,又称为归并排序,是利用分治法的一个典型应用。它将待排序的数组分为两个大小相等(或接近)的部分,对这两部分分别进行排序,然后将结果合并起来。这个过程可以递归进行,直到所有子序列都只有一个...
c++实现的合并排序算法 用递归和非递归两种方式实现的
Java 实现归并排序是一种常用的排序算法,通过分治策略将原始数组分成小组,然后对每个小组进行排序,最后将排序好的小组合并成一个有序数组。下面是 Java 实现归并排序的知识点总结: 基本思想 归并排序的基本...
快速排序、归并排序和堆排序都是经典且高效的排序算法,它们各自具有独特的实现方式和性能特点。这篇文章将详细探讨这三个排序算法,并对比它们的时间复杂度。 首先,我们来看快速排序。快速排序由C.A.R. Hoare在...
- 在C#中,归并排序通常用递归实现,通过两个辅助数组进行合并操作。 7. **基数排序**(Radix Sort): - 基数排序不是比较型排序,而是利用数字的位数进行排序。从低位到高位,对每个位数进行一次分配排序,如桶...
归并排序是分治策略的典型应用,将数组分成两个子数组,分别进行排序,再合并成一个有序数组。它保证了稳定性和O(n log n)的时间复杂度,但需要额外的空间来存储子数组,空间复杂度为O(n)。 4. **插入排序**: 插入...