聊聊C#归并排序算法

2023年 10月 9日 44.5k 0

前言

归并排序是一种常见的排序算法,它采用分治法的思想,在排序过程中不断将待排序序列分割成更小的子序列,直到每个子序列中只剩下一个元素,然后将这些子序列两两合并排序,最终得到一个有序的序列。

归并排序实现原理

  • 将待排序序列分割成两个子序列,直到每个子序列中只有一个元素。
  • 将相邻的两个子序列合并,并按照大小顺序合并为一个新的有序序列。
  • 不断重复第2步,直到所有子序列都合并为一个有序序列。
  • 归并排序代码实现

    public static void MergeSort(int[] arr, int left, int right)
    {
    if (left < right)
    {
    // 计算中间索引
    int mid = (left + right) / 2;

    // 对左半部分数组进行归并排序
    MergeSort(arr, left, mid);

    // 对右半部分数组进行归并排序
    MergeSort(arr, mid + 1, right);

    // 合并两个有序数组
    Merge(arr, left, mid, right);
    }
    }

    public static void Merge(int[] arr, int left, int mid, int right)
    {
    int n1 = mid - left + 1; // 左半部分数组的长度
    int n2 = right - mid; // 右半部分数组的长度

    // 创建临时数组
    int[] leftArr = new int[n1];
    int[] rightArr = new int[n2];

    // 将数据拷贝到临时数组
    for (int i = 0; i < n1; ++i)
    {
    leftArr[i] = arr[left + i];
    }

    for (int j = 0; j < n2; ++j)
    {
    rightArr[j] = arr[mid + 1 + j];
    }

    // 合并两个有序数组
    int k = left; // 初始化合并后的数组索引
    int p = 0; // 初始化左半部分数组的索引
    int q = 0; // 初始化右半部分数组的索引

    while (p < n1 && q < n2)
    {
    if (leftArr[p]

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论