归并排序的递归实现与非递归实现

归并排序

  • 归并排序图
归并排序图.png
  • 递归实现简介
    • 代码示例

       mergesort(left,right,**a){
           if(left<right){
               int mid = 1/2(left+right);
               mergesort(left,mid,**a);
               mergesort(mid+1,right,**a);
               merge(a,b,left,right);
               copy(a,b,left,right);
           }
       }
      
    • 代码解释

      • mergesort方法是向下分裂的方法
      • merge是一个排序方法,对a中的元素用两个指针移动进行比较存入b中
      • copy是一个赋值方法,把b中排序好的值给a
  • 非递归实现简介
    • 代码示例

       void merge_sort(int *list, int length){
           int i, left_min, left_max, right_min, right_max, next;
       
           int *tmp = (int*)malloc(sizeof(int) * length);
       
           for(i=1;i<length;i*=2){
               right_min = left_max = left_min+i;
               right_max = left_max+i;
           
               if(right_max>length){
                   right_max = length;
               }
           
               next = 0;
               while(left_min<left_max&&right_min<right_max){
                   tmp[next++] = list[left_min]>list[right_min]?list[right_min++]:list[left_min++];
               }
               while(left_min < left_max){
                   list[--right_min] = list[--left_max];
               }
               while(next>0){
                   list[--right_min] = tmp[--next];
               }
           }
       }
      
    • 算法实现解释

      • 代码实现步骤(按照i=1,2,4依次进行,都是相同的,所以只列出i=1的情况)
        • i=1:

           left[10],right[4]  
           left_min=0,left_max=1,right_min=1,right_max=2
           right_max<length
           双指针移动逐步比较直到有一边到达尾部
           点睛之笔是最后的两个while,
           第一个while是判断当left未移动到尾部时,将当前指针指向的值及之后的移动到队尾
           如果是right未移动到尾部,直接将tmp中的值按序赋值到list中即可
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,354评论 0 33
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,452评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 9,283评论 0 11
  • Java经典问题算法大全 /*【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子...
    赵宇_阿特奇阅读 5,950评论 0 2
  • 再多人对你的爱,也凑不出一个人对你完整的爱。而我们都想要那个喜欢的人的全部。我想要你的身体,你的每一寸肌肤;我想要...
    李阿冰阅读 2,405评论 0 1

友情链接更多精彩内容