当前位置:   article > 正文

五、C#归并排序算法

五、C#归并排序算法

简介

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

归并排序实现原理

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

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

  3. 不断重复第2步,直到所有子序列都合并为一个有序序列。

归并排序代码实现

  1. public static void MergeSort(int[] arr, int left, int right)
  2. {
  3. if (left < right)
  4. {
  5. // 计算中间索引
  6. int mid = (left + right) / 2;
  7. // 对左半部分数组进行归并排序
  8. MergeSort(arr, left, mid);
  9. // 对右半部分数组进行归并排序
  10. MergeSort(arr, mid + 1, right);
  11. // 合并两个有序数组
  12. Merge(arr, left, mid, right);
  13. }
  14. }
  15. public static void Merge(int[] arr, int left, int mid, int right)
  16. {
  17. int n1 = mid - left + 1; // 左半部分数组的长度
  18. int n2 = right - mid; // 右半部分数组的长度
  19. // 创建临时数组
  20. int[] leftArr = new int[n1];
  21. int[] rightArr = new int[n2];
  22. // 将数据拷贝到临时数组
  23. for (int i = 0; i < n1; ++i)
  24. {
  25. leftArr[i] = arr[left + i];
  26. }
  27. for (int j = 0; j < n2; ++j)
  28. {
  29. rightArr[j] = arr[mid + 1 + j];
  30. }
  31. // 合并两个有序数组
  32. int k = left; // 初始化合并后的数组索引
  33. int p = 0; // 初始化左半部分数组的索引
  34. int q = 0; // 初始化右半部分数组的索引
  35. while (p < n1 && q < n2)
  36. {
  37. if (leftArr[p] <= rightArr[q])
  38. {
  39. arr[k] = leftArr[p];
  40. p++;
  41. }
  42. else
  43. {
  44. arr[k] = rightArr[q];
  45. q++;
  46. }
  47. k++;
  48. }
  49. // 复制左半部分数组的剩余元素
  50. while (p < n1)
  51. {
  52. arr[k] = leftArr[p];
  53. p++;
  54. k++;
  55. }
  56. // 复制右半部分数组的剩余元素
  57. while (q < n2)
  58. {
  59. arr[k] = rightArr[q];
  60. q++;
  61. k++;
  62. }
  63. }
  64. public static void MergeSortRun()
  65. {
  66. int[] array = { 19, 27, 46, 48, 50, 2, 4, 44, 47, 36, 38, 15, 26, 5, 3 };
  67. Console.WriteLine("排序前数组:" + string.Join(", ", array));
  68. MergeSort(array, 0, array.Length - 1);
  69. Console.WriteLine("排序后数组:" + string.Join(", ", array));
  70. }

运行结果

总结

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/295251
推荐阅读
相关标签
  

闽ICP备14008679号