当前位置: 首页 > news >正文

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


http://www.mrgr.cn/news/25730.html

相关文章:

  • 【Linux】网络层协议——IP
  • 开关电源的占空比与输入输出电压的关系
  • golang学习笔记20——golang微服务负载均衡的问题与解决方案
  • 在Linux上安装中创中间件InforSuiteAS(二进制文件安装)
  • 探索C#编程:高效解决N皇后问题的回溯算法实现
  • 用Python实现时间序列模型实战——Day 19: 时间序列中的异常检测与处理
  • Stable Diffusion绘画 | ControlNet应用-Tile(分块)—tile_resample(分块-重采样)
  • 无人机视角的道路损害数据集,2400张图像,包括纵向裂缝(LC)、横向裂缝(TC)、鳄鱼裂缝(AC)、斜裂(OC)、修补(RP)和坑洞(PH),共2.3GB
  • 智慧工地数据集-可移动生产要素检测与分割
  • EmguCV学习笔记 C# 11.6 图像分割
  • 产品经理学习笔记
  • Django 安装指南
  • 大厂校招:星宸科技嵌入式面试及参考答案(5万字长文)
  • MATLAB | R2024b更新了哪些好玩的东西?
  • Java 每日一刊(第5期):变量守护者
  • 神经网络多层感知器异或问题求解-学习篇
  • 在麒麟系统 v10 SP3 上运行自带的 MariaDB
  • 低代码平台中脚本引擎Nashorn的应用
  • 开源PHP家谱应用Webtrees简介
  • 抖音微信超火国庆节国旗头像生成源码