算法-归并排序

PS:公众号「让我遇见相似的灵魂」,回复对应关键字【获取算法竞赛资料】。

左手代码,右手吉他,这就是天下:如果有一天我遇见相似的灵魂 那它肯定是步履艰难 不被理解 喜黑怕光的。如果可以的话 让我触摸一下吧
它也一样孤独得太久。 不一样的文艺青年,不一样的程序猿。

在这里插入图片描述

归并

分治

  1. 确定分界点, 中心点
  2. 递归左边、右边
  3. 归并——合二为一(重难点)

特点

  1. 稳定的
  2. 时间复杂度:nlog2^n妥妥的
#include<iostream>

using namespace std;

const int N = 1e6 + 10;

int n;
//temp辅助数组存排序结果
int q[N], temp[N];

void merge_sort(int q[], int l, int r){
    if(l >= r) return;
    
    //分界点(l+r)/2
    int mid = l + r >> 1; 
    
    //递归
    merge_sort(q, l, mid), merge_sort(q, mid + 1, r);
    
    //k已排序个数,i左边起点,j右边起点
    int k = 0, i = l, j = mid + 1; 
    while(i <= mid && j <= r)
        if(q[i] <= q[j]) temp[k ++] = q[i ++];
        else temp[k ++] = q[j ++];
    //把未循环完的加到末尾
    while(i <= mid) temp[k ++] = q[i ++];
    while(j <= r) temp[k ++] = q[j ++];
    
    //从排好序的数组中取回
    for(i = l, j = 0; i <= r; i++ ,j ++) q[i] = temp[j];
}

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;
}
发布了168 篇原创文章 · 获赞 127 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/weixin_43469680/article/details/104117274