• 归并排序及其非递归实现


    个人主页:Lei宝啊 

    愿所有美好如期而遇


    目录

    归并排序递归实现

    归并排序非递归实现


    归并排序递归实现

    图示:

    代码:

    先分再归并,像是后序一般。

    1. //归并排序
    2. void MergeSort(int* arr, int left, int right)
    3. {
    4. int* temp = (int*)malloc(sizeof(int) * (right));
    5. if (temp == NULL)
    6. {
    7. perror("malloc fail");
    8. }
    9. _MergeSort(arr, temp, left, right - 1);
    10. free(temp);
    11. }
    12. void _MergeSort(int* arr, int* temp, int left, int right)
    13. {
    14. if (left >= right)
    15. return;
    16. int mid = (left + right) / 2;
    17. int begin1 = left;
    18. int begin2 = mid + 1;
    19. int end1 = mid;
    20. int end2 = right;
    21. _MergeSort(arr, temp, left, mid);
    22. _MergeSort(arr, temp, mid + 1, right);
    23. int index = left;
    24. while (begin1 <= end1 && begin2 <= end2)
    25. {
    26. if (arr[begin1] < arr[begin2])
    27. {
    28. temp[index++] = arr[begin1++];
    29. }
    30. else
    31. {
    32. temp[index++] = arr[begin2++];
    33. }
    34. }
    35. while (begin1 <= end1)
    36. {
    37. temp[index++] = arr[begin1++];
    38. }
    39. while (begin2 <= end2)
    40. {
    41. temp[index++] = arr[begin2++];
    42. }
    43. memcpy(arr + left, temp + left, sizeof(int) * (right - left + 1));
    44. }

    归并排序非递归实现

    这里的非递归实现不可借助栈实现,因为返回去的时候,不能使之有序。

    代码:

    1. //归并排序非递归
    2. void MergeSortNonR(int* arr, int n)
    3. {
    4. int* temp = (int*)malloc(sizeof(int) * n);
    5. if (temp == NULL)
    6. {
    7. perror("malloc fail");
    8. }
    9. int gap = 1;
    10. while (gap < n)
    11. {
    12. for (int i = 0; i < n; i += 2 * gap)
    13. {
    14. //归并的区间
    15. int begin1 = i;
    16. int end1 = i + gap - 1;
    17. int begin2 = i + gap;
    18. int end2 = i + gap * 2 - 1;
    19. if (begin2 > n - 1)
    20. {
    21. break;
    22. }
    23. if (end2 > n - 1)
    24. {
    25. end2 = n - 1;
    26. }
    27. int index = i;//每次归并从i位置开始
    28. while (begin1 <= end1 && begin2 <= end2)
    29. {
    30. if (arr[begin1] < arr[begin2])
    31. {
    32. temp[index++] = arr[begin1++];
    33. }
    34. else
    35. {
    36. temp[index++] = arr[begin2++];
    37. }
    38. }
    39. while (begin1 <= end1)
    40. {
    41. temp[index++] = arr[begin1++];
    42. }
    43. while (begin2 <= end2)
    44. {
    45. temp[index++] = arr[begin2++];
    46. }
    47. memcpy(arr + i, temp + i, sizeof(int) * (end2 - i + 1));
    48. }
    49. gap *= 2;
    50. }
    51. free(temp);
    52. }

    时间复杂度O(n*logn),空间复杂度O(N);

  • 相关阅读:
    【定义】矩阵
    Increment Selection 插件
    数据结构第六章图部分知识点
    【用unity实现100个游戏之11】复刻经典消消乐游戏
    约数个数定理
    C# Tryparse的使用说明
    【Node.js实战】构建商品管理系统:从前端到后端的全栈开发实践
    一、Prometheus集成Grafana可视化监控安装详解
    1036 Boys vs Girls
    uboot DM驱动注册与初始化
  • 原文地址:https://blog.csdn.net/m0_74824254/article/details/133496734