归并排序的实现

终于调通归并了

/*
 *本算法核心思想为 divide and conquer
 *本头文件用于实现归并排序,该排序的算法复杂度为O(n*logn)
 * 而且算法稳定,不会退化为O(n*n)
 */ 


#ifndef _MERGESORT_INCLUDE_
#define _MERGESORT_INCLUDE_


/*
 *origin 是原数组(存放最开始的元素)
 *low 是区间的最小下标, high是最大下标 ( [low, high))
 *target 是目的数组,也是存放排序好的数组,也是每次二分后存放排序好的数组
 *
 */ 
template<typename T> void merge_sort (T* origin , T low , T high , T* target)
{
    if(high - low > 1){

   T mid = low + ( (high - low ) > 1 ) ;   //开始二分
   T p = low ; T q = mid; T x = low ; //p为左边左边界 , q为右边左边界 x 为 填充
   merge_sort (origin , low , mid , target); //左半边 [low , mid )

   merge_sort (origin , mid , high, target); //右半边

   while( p < mid || q < high)
   {
       if(q >= high || ( p < mid &&origin[p] <= origin[q]  )) target[x++] = origin[p++];
       else                                                 target[x++] = origin[q++]; // cnt += mid - p 统计逆序数的数目
   }
    
   for(int i = low ; i < high ; i++)origin[i] = target[i]; //归并,复制回来元素
}
}


#endif

该算法是divide and conquer 的典型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值