五、C#归并排序算法

简介

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

归并排序实现原理

  1. 将待排序序列分割成两个子序列,直到每个子序列中只有一个元素。

  2. 将相邻的两个子序列合并,并按照大小顺序合并为一个新的有序序列。

  3. 不断重复第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] <= rightArr[q])
                {
                    arr[k] = leftArr[p];
                    p++;
                }
                else
                {
                    arr[k] = rightArr[q];
                    q++;
                }
                k++;
            }

            // 复制左半部分数组的剩余元素
            while (p < n1)
            {
                arr[k] = leftArr[p];
                p++;
                k++;
            }

            // 复制右半部分数组的剩余元素
            while (q < n2)
            {
                arr[k] = rightArr[q];
                q++;
                k++;
            }
        }

        public static void MergeSortRun()
        {
            int[] array = { 19, 27, 46, 48, 50, 2, 4, 44, 47, 36, 38, 15, 26, 5, 3 };
            Console.WriteLine("排序前数组:" + string.Join(", ", array));

            MergeSort(array, 0, array.Length - 1);

            Console.WriteLine("排序后数组:" + string.Join(", ", array));
        }   

运行结果

总结

归并排序是一种高效稳定的排序算法,时间复杂度为O(nlogn)。它的核心思想是将待排序序列分割成更小的子序列,然后逐步合并并排序这些子序列,最终得到一个有序序列。归并排序需要额外的空间来存储临时数组,但由于其分治的特性,适用于对链表和外部存储的排序。

C#十大排序总结-CSDN博客

相关推荐

  1. C#算法归并排序

    2024-03-23 12:48:01       10 阅读
  2. 排序算法——归并排序

    2024-03-23 12:48:01       37 阅读
  3. C语言】归并排序算法实现

    2024-03-23 12:48:01       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-23 12:48:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-23 12:48:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-23 12:48:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-23 12:48:01       20 阅读

热门阅读

  1. 大数定律与中心极限定理

    2024-03-23 12:48:01       19 阅读
  2. zookeeper 总结

    2024-03-23 12:48:01       20 阅读
  3. springboot 单元测试

    2024-03-23 12:48:01       16 阅读
  4. 富格林:重视平台挑选阻挠虚假

    2024-03-23 12:48:01       20 阅读
  5. 工作量证明机制

    2024-03-23 12:48:01       21 阅读
  6. python课程学习代码:调用接口

    2024-03-23 12:48:01       17 阅读
  7. pytorch中的梯度裁剪

    2024-03-23 12:48:01       21 阅读
  8. 【科普向】什么是数据湖架构

    2024-03-23 12:48:01       19 阅读
  9. LeetCode的LRU缓存实现

    2024-03-23 12:48:01       15 阅读
  10. 69、FIFO缓存发送数据(先入先出)

    2024-03-23 12:48:01       17 阅读
  11. ubuntu生成 设置 core文件

    2024-03-23 12:48:01       20 阅读
  12. Vue 常见面试题(一)

    2024-03-23 12:48:01       17 阅读
  13. 0x01_实验课leetcode

    2024-03-23 12:48:01       18 阅读
  14. [leetcode] 21. 合并两个有序链表

    2024-03-23 12:48:01       17 阅读