算法--归并排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qqxyy99/article/details/52819160

  一、简介
    归并排序(Merge Sorting),不同于插入排序、交换排序和选择排序。其不同之处表现在:要求待排序列是由若干个有序子序列组成。
  二、归并的含义及核心
    将两个或两个以上的有序表合并成一个新的有序表。
  三、合并的方法
    比较各子序列第一个记录的兼职,最小的一个就是排序后序列的第一个记录的键值。取出这个记录,继续比较各子序列出现的第一个记录的兼职,一次找出排序后的第二个记录。如此继续下去,最终就会得到排序结果。
  四、代码实例
    前提解释:目前两个有序序列,ah,…am和am+1,…,an,对应的键值分别满足,kh<=…<=km,km+1<=…<=kn,合并成一个有序序列Rh,…,Rn,使合并后的序列键值满足k’h<=…<=k’m<=k’m+1
<=…<=k’n

  void Merge(List a,List R,int h,int m,int n)
  //将以上两个有序序列合并成一个有序序列R
  { k=h;j=m+1;           //这里讲k,j设为文件的起始位置
    while((h<=m)&&(j<=n)) //接下来就将a中的记录从小到大合并到R中
     {
      if(a[h].key<=a[j].key) //若a[h]中的键值较小
       {
        R[k]=a[h]; //a[h]值送到R[k]中
        h++; //修改h的值(即取出后剩余序列里的第一个)
       }
      else{  //否则a[j]值较小
          R[k]=a[j];  //a[j]值送到R[k]中
          j++; //修改j的值
      }
      k++;         
     }
    while (h<=m) 
     {
         R[k]=a[h];h++;K++;
         //j>n。将ah,...am剩余部分插入R的末尾
     }
    while (j<=n)
     {
         R[k]=a[j];j++;k++;
         //h>m。将am+1,...an剩余部分插入R的末尾
     }
  }


  此算法的执行时间为O(n-h+1).时间复杂度为O(nlog2n),是稳定的算法。
   上述部分为数据结构与导论课本的基本内容,稍后补充自己的理解。

猜你喜欢

转载自blog.csdn.net/qqxyy99/article/details/52819160