算法——归并排序

简介: 算法——归并排序

一、算法简介

归并排序(Merge Sort)是一种基于分治思想的排序算法,它将待排序的数组不断一分为二,直到划分成单个元素为止,然后再将小的子数组逐步合并成较大的有序数组,最终完成整个数组的排序。

归并排序的基本思想是先递归地将数组一分为二,然后对两个子数组进行排序,最后将排序好的子数组合并成一个有序的数组。在合并的过程中,通过比较两个子数组中的元素,按从小到大(或从大到小)的顺序放入一个临时数组中,直至将两个子数组完全合并为止。

归并排序的实现通过递归和迭代两种方式都可以完成。其中,递归方式的实现较简单,而迭代方式则需要使用循环和辅助空间来实现合并操作。

归并排序的时间复杂度为O(nlogn),具有稳定性,即相等元素的顺序在排序后保持不变。它是一种效率较高的排序算法,特别适用于大规模数据的排序。

二、算法实现

下面是归并排序在C#中的一个示例实现:

public static void MergeSort(int[] array)
{
    int n = array.Length;
    
    if (n < 2)
        return;
    
    int mid = n / 2;
    int[] left = new int[mid];
    int[] right = new int[n - mid];
    // 将数组分成左右两个子数组
    for (int i = 0; i < mid; i++)
    {
        left[i] = array[i];
    }
    
    for (int i = mid; i < n; i++)
    {
        right[i - mid] = array[i];
    }
    // 递归地对左右子数组进行排序
    MergeSort(left);
    MergeSort(right);
    // 合并已排序的左右子数组
    Merge(left, right, array);
}
private static void Merge(int[] left, int[] right, int[] array)
{
    int leftLength = left.Length;
    int rightLength = right.Length;
    int i = 0, j = 0, k = 0;
    while (i < leftLength && j < rightLength)
    {
        if (left[i] <= right[j])
        {
            array[k] = left[i];
            i++;
        }
        else
        {
            array[k] = right[j];
            j++;
        }
        k++;
    }
    // 如果左子数组还有未处理的元素,将其放入合并后的数组中
    while (i < leftLength)
    {
        array[k] = left[i];
        i++;
        k++;
    }
    // 如果右子数组还有未处理的元素,将其放入合并后的数组中
    while (j < rightLength)
    {
        array[k] = right[j];
        j++;
        k++;
    }
}

调用示例:

int[] array = { 12, 11, 13, 5, 6, 7 };
MergeSort(array);
Console.WriteLine("排序后的数组:");
foreach (int element in array)
{
    Console.Write(element + " ");
}

以上是一个简单的归并排序实现示例。在该实现中,使用递归方式对数组进行划分和排序,并通过合并操作将已排序的子数组合并为一个有序的数组。注意,在合并过程中需要创建临时数组来辅助合并操作。请注意,在实际应用中,还可以进行一些优化措施,如改进合并操作、避免创建额外的临时数组等。

相关文章
|
4月前
|
机器学习/深度学习 算法 搜索推荐
【初阶算法4】——归并排序的详解,及其归并排序的扩展
【初阶算法4】——归并排序的详解,及其归并排序的扩展
【初阶算法4】——归并排序的详解,及其归并排序的扩展
|
5月前
|
算法 前端开发 搜索推荐
前端算法之归并排序
前端算法之归并排序
31 0
|
2月前
|
算法 搜索推荐 Java
算法实战:手写归并排序,让复杂排序变简单!
归并排序是一种基于“分治法”的经典算法,通过递归分割和合并数组,实现O(n log n)的高效排序。本文将通过Java手写代码,详细讲解归并排序的原理及实现,帮助你快速掌握这一实用算法。
38 0
|
2月前
|
数据采集 搜索推荐 算法
【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!
【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。
24 0
|
3月前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
【7月更文挑战第12天】归并排序是高效稳定的排序算法,采用分治策略。Python 实现包括递归地分割数组及合并已排序部分。示例代码展示了如何将 `[12, 11, 13, 5, 6]` 分割并归并成有序数组 `[5, 6, 11, 12, 13]`。虽然 $O(n log n)$ 时间复杂度优秀,但需额外空间,适合大规模数据排序。对于小规模数据,可考虑其他算法。**
67 4
|
4月前
|
搜索推荐 算法 Java
Java中的快速排序、归并排序和堆排序是常见的排序算法。
【6月更文挑战第21天】Java中的快速排序、归并排序和堆排序是常见的排序算法。快速排序采用分治,以基准元素划分数组并递归排序;归并排序同样分治,先分割再合并有序子数组;堆排序通过构建堆来排序,保持堆性质并交换堆顶元素。每种算法各有优劣:快排平均高效,最坏O(n²);归并稳定O(n log n)但需额外空间;堆排序O(n log n)且原地排序,但不稳定。
37 3
|
4月前
|
算法
数据结构与算法-归并排序
数据结构与算法-归并排序
26 2
|
5月前
|
存储 搜索推荐 算法
归并排序算法深入解析
归并排序算法深入解析
|
4月前
|
搜索推荐 C语言
【C/排序算法】:快速排序和归并排序的非递归实现
【C/排序算法】:快速排序和归并排序的非递归实现
24 0
|
4月前
|
搜索推荐 算法
【C/排序算法】:归并排序和计数排序
【C/排序算法】:归并排序和计数排序
30 0
下一篇
无影云桌面