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)。它的核心思想是将待排序序列分割成更小的子序列,然后逐步合并并排序这些子序列,最终得到一个有序序列。归并排序需要额外的空间来存储临时数组,但由于其分治的特性,适用于对链表和外部存储的排序。

相关推荐
追逐时光者5 天前
C#/.NET/.NET Core开发实战教程集
【.net】·【c#】·【.net core】
追逐时光者6 天前
C#/.NET/.NET Core技术前沿周刊 | 第 7 期(2024年9.23-9.30)
【.net】·【c#】·【开源项目】·【实用工具】·【.net core】·【技术前沿周刊】
追逐时光者10 天前
WaterCloud:一套基于.NET 8.0 + LayUI的快速开发框架,完全开源免费!
【.net】·【c#】·【开源项目】·【.net core】
追逐时光者13 天前
C#/.NET/.NET Core技术前沿周刊 | 第 6 期(2024年9.16-9.22)
【.net】·【c#】·【开源项目】·【.net core】·【技术前沿周刊】
追逐时光者14 天前
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
【.net】·【c#】·【开源项目】·【.net core】
追逐时光者16 天前
.NET常见的几种项目架构模式,你知道几种?(附带使用情况投票)
【.net】·【c#】·【.net core】·【面试指南】
追逐时光者20 天前
C#/.NET/.NET Core技术前沿周刊 | 第 5 期(2024年9.9-9.15)
【.net】·【c#】·【开源项目】·【.net core】·【技术前沿周刊】
追逐时光者23 天前
Entity Framework Plus: 让 EF Core 开发如虎添翼
【.net】·【c#】·【开源项目】·【.net core】·【ef core】
追逐时光者24 天前
浅谈 C# 中的顶级语句
【.net】·【c#】·【.net core】·【拾遗补漏】
追逐时光者25 天前
C#/.NET/.NET Core优秀项目和框架2024年8月简报
【.net】·【c#】·【开源项目】·【实用工具】·【.net core】·【每月简报】