当前位置:   article > 正文

归并排序算法及C语言实现_写出归并排序的程序。(高阶要求写出改进后归并排序算法)接收输入数据,输出排序结

写出归并排序的程序。(高阶要求写出改进后归并排序算法)接收输入数据,输出排序结

一、归并排序的原理

归并排序(Merge Sort)是一种基于分治思想的高效排序算法。其核心思想是将待排序的数组分为两个相等的部分,对这两个部分分别进行递归排序,最后将两个有序的子数组合并成一个有序的整体。可见归并排序的时间复杂度为 O(nlog2n)。

下面我们来详细地介绍一下归并排序的过程:

  1. 分解将待排序的数组递归分解为越来越小的子序列,直到分解成单个元素的子序列。

  1. 合并将相邻的两个单个元素的子序列进行合并,成为一个长度为 2 的有序子序列;接着,将相邻的两个长度为 2 的有序子序列合并,成为一个长度为 4 的有序子序列;以此类推,直到合并成一个完整的排好序的序列。

二、归并排序的C语言实现

以下是归并排序的 C 语言实现:

  1. #include <stdio.h>
  2. // 合并函数
  3. void merge(int arr[], int l, int m, int r){
  4. int i, j, k;
  5. int n1 = m - l + 1;
  6. int n2 = r - m;
  7. // 临时数组
  8. int L[n1], R[n2];
  9. // 把数据存储到临时数组
  10. for (i = 0; i < n1; i++){
  11. L[i] = arr[l + i];
  12. }
  13. for (j = 0; j < n2; j++){
  14. R[j] = arr[m + 1 + j];
  15. }
  16. // 归并临时数组到原数组
  17. i = 0;
  18. j = 0;
  19. k = l;
  20. while (i < n1 && j < n2){
  21. if (L[i] <= R[j]){
  22. arr[k] = L[i];
  23. i++;
  24. } else {
  25. arr[k] = R[j];
  26. j++;
  27. }
  28. k++;
  29. }
  30. // 把剩余的元素复制到原数组
  31. while (i < n1){
  32. arr[k] = L[i];
  33. i++;
  34. k++;
  35. }
  36. while (j < n2){
  37. arr[k] = R[j];
  38. j++;
  39. k++;
  40. }
  41. }
  42. // 归并排序函数
  43. void merge_sort(int arr[], int l, int r){
  44. if (l < r) {
  45. int m = l + (r - l) / 2;
  46. // 分别递归排序左右两部分
  47. merge_sort(arr, l, m);
  48. merge_sort(arr, m + 1, r);
  49. // 合并排序后的两部分
  50. merge(arr, l, m, r);
  51. }
  52. }
  53. // 测试
  54. int main(){
  55. int arr[] = {38, 27, 43, 3, 9, 82, 10};
  56. int n = sizeof(arr)/sizeof(arr[0]);
  57. // 排序前
  58. printf("Before sorting: ");
  59. for (int i = 0; i < n; i++){
  60. printf("%d ", arr[i]);
  61. }
  62. printf("\n");
  63. // 排序
  64. merge_sort(arr, 0, n - 1);
  65. // 排序后
  66. printf("After sorting: ");
  67. for (int i = 0; i < n; i++){
  68. printf("%d ", arr[i]);
  69. }
  70. printf("\n");
  71. return 0;
  72. }

输出结果如下:

  1. Before sorting: 38 27 43 3 9 82 10
  2. After sorting: 3 9 10 27 38 43 82

以上代码中,merge 函数用于合并两个有序数组,merge_sort 函数是归并排序的主体函数,用于递归排序和合并数组。我们在 main 函数中使用了 merge_sort 对数组进行了排序。

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

闽ICP备14008679号