C# 两路归并排序

两路归并排序

/// <summary>
  /// 对目标数组进行归并排序
  /// 与QuickSort的分治比较,感受递归
  /// </summary>
  /// <param name="dest">目标数组</param>
  /// <param name="tempDest">暂存数组</param>
  /// <param name="left">当前部分左位置</param>
  /// <param name="right">当前部分右位置</param>
  /// <param name="swapTimes">当前部分中间位置</param>
  public static void TwoWayMergeSort(int[] dest, int[] tempDest, int left, int right, ref int swapTimes)
  {
   if(left < right)
   {
    int mid = (left + right) / 2;
    //分割通过递归实现
    TwoWayMergeSort(dest, tempDest, left, mid, ref swapTimes);//左一半
    TwoWayMergeSort(dest, tempDest, mid + 1, right, ref swapTimes);//右一半
    Merge(dest, tempDest, left, right, mid, ref swapTimes);//对左右各半进行归并
   }
  }
  

  /// <summary>
  /// 对当前部分进行归并
  /// </summary>
  /// <param name="dest"></param>
  /// <param name="tempDest"></param>
  /// <param name="left"></param>
  /// <param name="right"></param>
  /// <param name="mid"></param>
  /// <param name="swapTimes">逆置位置</param>
  private static void Merge(int[] dest, int[] tempDest, int left, int right, int mid, ref int swapTimes)
  {
   for(int i = left; i <= right; i ++)
    tempDest[i] = dest[i];
   int index1 = left;
   int index2 = mid + 1;
   int index = left;//用left很重要,如若是0则会对dest的位置重复赋值
   //|-------|--------|
   // ^index1 ^index2,体现了归并的妙
   while(index1 <= mid && index2 <= right) 
   {
    if(tempDest[index1] <= tempDest[index2])
    {
     dest[index ++] = tempDest[index1 ++];
    }
    else
    {
     dest[index ++] = tempDest[index2 ++];
     swapTimes ++;
    }
   }
 
   while(index2 <= right)
   {
    dest[index ++] = tempDest[index2 ++];
   }

   while(index1 <= mid)
   {
    dest[index ++] = tempDest[index1 ++];
   }
  }

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值