您现在的位置是:首页 >

归并排序思路 排序 - 归并排序(一)

火烧 2021-05-09 00:36:46 1048
排序 - 归并排序(一)   归并排序 Merge Sort 是利用 归并 技术来进行排序 归并是指将若干个已排序的子文件合并成一个有序的文件   两路归并算法   算法基本思路  设两个有序的子文件
归并排序思路 排序 - 归并排序(一)

排序 - 归并排序(一)  

  归并排序(Merge Sort)是利用 归并 技术来进行排序 归并是指将若干个已排序的子文件合并成一个有序的文件

  两路归并算法

   算法基本思路

  设两个有序的子文件(相当于输入堆)放在同一向量中相邻的位置上 R[low m] R[m+ high] 先将它们合并到一个局部的暂

  存向量R (相当于输出堆)中 待合并完成后将R 复制回R[low high]中

  ( )合并过程

  合并过程中 设置i j和p三个指针 其初值分别指向这三个记录区的起始位置 合并时依次比较R[i]和R[j]的关键字 取关键

  字较小的记录复制到R [p]中 然后将被复制记录的指针i或j加 以及指向复制位置的指针p加

  重复这一过程直至两个输入的子文件有一个已全部复制完毕(不妨称其为空) 此时将另一非空的子文件中剩余记录依次复制到

  R 中即可

  ( )动态申请R

  实现时 R 是动态申请的 因为申请的空间可能很大 故须加入申请空间是否成功的处理

   归并算法

  void Merge(SeqList R int low int m int high)

  {//将两个有序的子文件R[low m)和R[m+ high]归并成一个有序的

  //子文件R[low high]

  int i=low j=m+ p= ; //置初始值

  RecType *R ; //R 是局部向量 若p定义为此类型指针速度更快

  R =(ReeType *)malloc((high low+ )*sizeof(RecType));

  if(! R ) //申请空间失败

  Error( Insufficient memory available! );

  while(i<=m&&j<=high) //两子文件非空时取其小者输出到R [p]上

  R [p++]=(R[i] key<=R[j] key)?R[i++] R[j++];

  while(i<=m) //若第 个子文件非空 则复制剩余记录到R 中

  R [p++]=R[i++];

  while(j<=high) //若第 个子文件非空 则复制剩余记录到R 中

  R [p++]=R[j++];

  for(p= i=low;i<=high;p++ i++)

  R[i]=R [p];//归并完成后将结果复制回R[low high]

lishixinzhi/Article/program/sjjg/201311/23778  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码