C++ 实现归并排序(分冶法)

本文深入探讨了归并排序算法的实现细节,包括递归分解和归并过程。通过具体的代码示例,详细解释了如何将一个数组分成若干部分进行排序,再合并成一个有序数组的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//分
void merge_sort(int * data, int start , int end , int * result)
{
       if(1==end - start)   //如果区间内只有两个元素   直接对这两元素排序
       {
             if(data[start]> data[end])
             {
                data[start] = data[start]^= data[end];
                data[end] = data[start]^= data[end];
                data[start]= data[start]^= data[end];
             }
             return;
       }
       else if (0== end - start) //元素为1 不排序
        return;
        else
        {
          merge_sort(data, start , (end-start+1)/2+start , result);    //(end-start+1)是元素的总个数
          merge_sort(data, (end-start+1)/2+start+1,end,result );   //递归分别把左右子区间排序
          merge(data,start,end,result); //把所有排好序的子区间进行归并
          for(int i = start;i<=end;i++)          //把排序后的result 数据倒回原数组中
          {
             data[i] = result[i];
          }
        }
}


void  merge( int * data, int start ,int end, int * result)
{
      int left_length = (end-start+1)/2+1;     //左区间的长度;
      int left_index = start;
      int right_index = start + left_length;  //右区间开始的下标
      int result_index = start;       			   //临时数组的下标
      while(left_index<right_index&&right_index< end+1)  
      {
            if(data[left_index]> data[right_index])
               result[result_index++]=data[right_index++];
            else
               result[result_index++]=data[left_index++];
      }
      //跳出循环有两种可能 一是左区间数据已遍历完,二是右区间数据已遍历完,所以要分两种情况把剩余的数据倒入result里
      while(left_index<right_index)
         result[result_index++] = data[left_index++];
      while(right_index<end+1)
         result[result_index++] = data[right_index++];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值