归并排序模板

模板在文末,以下步骤方便理解记忆。

先贴一张快速排序模板步骤,用于对比记忆

归并排序步骤

(0)如果数组左边界L ≥ 数组右边界,则不需要排序,直接return。

(1)直接取数组正中间的数,即 mid = (L+R) / 2为边界。

(2)先递归,对 L~mid ,mid+1 ~ R 这两个区间的数组调用归并排序函数。

(3)对于每次归并,它的面前有两个排好序的数组,即 [ L, mid ] 和 [ mid+1, R ],接下来需要把这两个数组合为另一个有序的数组。

具体操作是采用双下标指针,首先令 i = L,j = mid + 1(即两个数组的左边界)

接着,让q[ i ]和q[ j ]中更小的那个先放进 temp 数组里,然后 i++ 或 j++,以此类推。

当其中一个下标指针到达末端时,直接将另一个数组原封不动的拷贝进 temp 数组里。

(4)最后把 temp 数组拷贝到 q 数组中。(这一步容易写错

#include<iostream>
using namespace std;

const int N = 100010;

int n;
int q[N], temp[N];

void merge_sort(int q[], int l, int r)
{
    if(l >= r) return;
    
    int mid = (l+r) >> 1;
    
    merge_sort(q, l, mid), merge_sort(q, mid+1, r);
    
    int i = l, j = mid+1, k = 0;
    while(i <= mid && j <= r) //对应步骤(3),而且当两个数组的指针都没有越界时才这么做
    {
        if(q[i] < q[j]) temp[k++] = q[i++];
        else            temp[k++] = q[j++];
    }
    while(i <= mid)     temp[k++] = q[i++]; //如果i没有越界,则将i后面的原封不动地拷贝进去
    while(j <= r)       temp[k++] = q[j++]; //如果j没有越界,则将j后面拷贝进去
    
    //q和temp数组的范围不同,因此需要两个变量i,j
    //         注意不是i <= n
    for(int i=l, j=0; i <= r; ++i, ++j) q[i] = temp[j]; //步骤(4),注意写法
}

int main()
{
    scanf("%d", &n);
    
    for(int i=0;i<n;++i) scanf("%d", &q[i]);
    
    merge_sort(q, 0, n-1);
    
    for(int i=0;i<n;++i) printf("%d ", q[i]);
    
    return 0;
}

 

相关推荐

  1. 归并排序模板

    2024-01-24 19:30:01       32 阅读
  2. 【算法】归并排序模板

    2024-01-24 19:30:01       17 阅读
  3. AcWing 787. 归并排序模板题详解)

    2024-01-24 19:30:01       33 阅读
  4. 线段树、树状数组、归并排序模板

    2024-01-24 19:30:01       14 阅读
  5. 归并排序

    2024-01-24 19:30:01       18 阅读
  6. 归并排序

    2024-01-24 19:30:01       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-24 19:30:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-24 19:30:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-24 19:30:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-24 19:30:01       20 阅读

热门阅读

  1. 如何使用阿里云函数计算

    2024-01-24 19:30:01       33 阅读
  2. 【unity】unity中如何随机选取list中的对象

    2024-01-24 19:30:01       33 阅读
  3. 892. 台阶-Nim游戏

    2024-01-24 19:30:01       36 阅读
  4. 微信小程序从入门到进阶(一)

    2024-01-24 19:30:01       31 阅读
  5. nginx 实现动静分离

    2024-01-24 19:30:01       38 阅读
  6. mysql使用过程常见报错问题解决

    2024-01-24 19:30:01       40 阅读
  7. Servlet重定向转发及自动加载

    2024-01-24 19:30:01       31 阅读
  8. css中px和em的区别

    2024-01-24 19:30:01       36 阅读