基础算法3——归并排序 c语言

3.归并排序

  • 主要思想:分治。

  • 步骤:

    1.确定分界点:mid=(left+right)/2;

    2.分别递归排序right and left;

    3.归并左右两边。

    归并方法:1)两指针分别指向两数组的第一个数,数列最小值是两者其中之一;

    2)取两指针所指数的最小值,作为有序数组的下一个数;

    3)被取值的指针后移一位,再与另一指针所指数比较;

    4)重复上述过程,直到有一数组值被取完;

    5)将数组剩余的数直接连接到有序数列后。

eg.从小到大
void merge_sort(int q[], int l, int r)
{
     if (l >= r)return; //未排列数列只剩一个或没有数时退出
     //确定分界点
     int mid = (l + r) / 2;
     //两边分别递归
     merge_sort(q, l, mid);
     merge_sort(q, mid + 1, r);
     //合二为一
     int k = 0, i = l, j = mid + 1;//i取第一个数组,j取第二个
     while (i <= mid && j <= r)
     {
          if (q[i] <= q[j])
          {
               t[k++] = q[i++];
          }
          else
          {
               t[k++] = q[j++];
          }
     }
     //如果有一数组已经被去完,则直接连接剩余的数
     while (i <= mid)
     {
          t[k++] = q[i++];
     }
     while (j <= r)
     {
          t[k++] = q[j++];
     }
     //把替换数组t存入原数组
     for (i = l,j=0; i <= r; j++,i++)
     {
          q[i] = t[j];
     }
}
eg.从小到大
void merge_sort(int q[], int l, int r)
{
     if (l >= r)return; 
     
     int mid = (l + r) / 2;
     
     merge_sort(q, l, mid);
     merge_sort(q, mid + 1, r);
     
     int k = 0, i = l, j = mid + 1;
     while (i <= mid && j <= r)
     {
          if (q[i] >= q[j])//只需更改此处运算符号
          {
               t[k++] = q[i++];
          }
          else
          {
               t[k++] = q[j++];
          }
     }
     
     while (i <= mid)
     {
          t[k++] = q[i++];
     }
     while (j <= r)
     {
          t[k++] = q[j++];
     }
     
     for (i = l,j=0; i <= r; j++,i++)
     {
          q[i] = t[j];
     }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值